c-decl.c (diagnose_mismatched_decls): Give an error for redefining a typedef with...
authorJoseph Myers <joseph@codesourcery.com>
Fri, 18 Mar 2011 23:26:16 +0000 (23:26 +0000)
committerJoseph Myers <jsm28@gcc.gnu.org>
Fri, 18 Mar 2011 23:26:16 +0000 (23:26 +0000)
* c-decl.c (diagnose_mismatched_decls): Give an error for
redefining a typedef with variably modified type.

testsuite:
* gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of
variably modified typedefs.
* gcc.dg/c1x-typedef-2.c: Remove.

From-SVN: r171172

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c1x-typedef-1.c
gcc/testsuite/gcc.dg/c1x-typedef-2.c [deleted file]

index b6680a99ab55d314bc5abee744748d14a505202e..7c2b4d73711ada60d7b8ab885da8f45e725f693f 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-18  Joseph Myers  <joseph@codesourcery.com>
+
+       * c-decl.c (diagnose_mismatched_decls): Give an error for
+       redefining a typedef with variably modified type.
+
 2011-03-18  Joseph Myers  <joseph@codesourcery.com>
 
        * c-decl.c (grokfield): Don't allow typedefs for structures or
index 8f9c44400482f72e8fac60f1989dece2b3a7363e..4e82f2844a8155c39cea36321510e54e06cf042f 100644 (file)
@@ -1813,20 +1813,16 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
          || TREE_NO_WARNING (olddecl))
        return true;  /* Allow OLDDECL to continue in use.  */
 
-      if (pedantic && !flag_isoc1x)
+      if (variably_modified_type_p (newtype, NULL))
        {
-         pedwarn (input_location, OPT_pedantic,
-                  "redefinition of typedef %q+D", newdecl);
+         error ("redefinition of typedef %q+D with variably modified type",
+                newdecl);
          locate_old_decl (olddecl);
        }
-      else if (variably_modified_type_p (newtype, NULL))
+      else if (pedantic && !flag_isoc1x)
        {
-         /* Whether there is a constraint violation for the types not
-            being the same cannot be determined at compile time; a
-            warning that there may be one at runtime is considered
-            appropriate (WG14 reflector message 11743, 8 May 2009).  */
-         warning (0, "redefinition of typedef %q+D may be a constraint "
-                  "violation at runtime", newdecl);
+         pedwarn (input_location, OPT_pedantic,
+                  "redefinition of typedef %q+D", newdecl);
          locate_old_decl (olddecl);
        }
 
index 3cda22b33a251e35733778b60cd4708647b49755..1a30a107a745d30d9f7ddc9687347e659be663b1 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-18  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of
+       variably modified typedefs.
+       * gcc.dg/c1x-typedef-2.c: Remove.
+
 2011-03-18  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/c1x-anon-struct-1.c: Don't test use of typedefs.
index 2b0bc74208acce337609393a00ae5a2bfeb5b1f4..a68b23ff5e6c4347cc5d7257d9747f2bb6ac4f5b 100644 (file)
@@ -3,7 +3,8 @@
 /* { dg-options "-std=c1x -pedantic-errors" } */
 
 /* C1X permits typedefs to be redeclared to the same type, but not to
-   different-but-compatible types.  */
+   different-but-compatible types, and not when the type is variably
+   modified.  */
 
 #include <limits.h>
 
@@ -60,9 +61,10 @@ f (void)
   typedef void FN2(int (*p)[*]); /* { dg-message "previous declaration" } */
   typedef void FN2(int (*p)[]); /* { dg-error "with different type" } */
   typedef int AV[a]; /* { dg-message "previous declaration" } */
-  typedef int AV[b-1]; /* { dg-warning "may be a constraint violation at runtime" } */
-  typedef int AAa[a];
+  typedef int AV[b-1]; /* { dg-error "redefinition" } */
+  typedef int AAa[a]; /* { dg-message "previous declaration" } */
   typedef int AAb[b-1];
   typedef AAa *VF(void); /* { dg-message "previous declaration" } */
-  typedef AAb *VF(void); /* { dg-warning "may be a constraint violation at runtime" } */
+  typedef AAb *VF(void); /* { dg-error "redefinition" } */
+  typedef AAa AAa; /* { dg-error "redefinition" } */
 }
diff --git a/gcc/testsuite/gcc.dg/c1x-typedef-2.c b/gcc/testsuite/gcc.dg/c1x-typedef-2.c
deleted file mode 100644 (file)
index fb5d918..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Test typedef redeclaration in C1X.  Side effects from duplicate
-   declarations still apply.  */
-/* { dg-do run } */
-/* { dg-options "-std=c1x -pedantic-errors" } */
-
-extern void exit (int);
-extern void abort (void);
-
-int
-main (void)
-{
-  int a = 1, b = 1;
-  typedef int T[++a]; /* { dg-message "previous declaration" } */
-  typedef int T[++b]; /* { dg-warning "may be a constraint violation at runtime" } */
-  if (a != 2 || b != 2)
-    abort ();
-  exit (0);
-}