This week's London WG14 meeting decided that typedef redefinition should not be allowed in the case of variably modified types. This patch implements this, giving an error for such redefinitions.
Bootstrapped with no regressions on x86_64-unknown-linux-gnu. Applied to mainline. Any comments from other RMs about whether this should go in 4.6 as well, to avoid 4.6.0 being more lenient in this area than both 4.5 and 4.7? This is much the same issue as for anonymous structs and unions, but for a much more obscure case. (These two patches cover the only two cases of C1X features that were fully implemented for 4.6 according to the pre-London draft, and then changed in London. The post-London document will be going to enquiry-stage ITTF/JTC1 ballot so if that passes there should be no more technical changes before publication.) 2011-03-18 Joseph Myers <jos...@codesourcery.com> * c-decl.c (diagnose_mismatched_decls): Give an error for redefining a typedef with variably modified type. testsuite: 2011-03-18 Joseph Myers <jos...@codesourcery.com> * gcc.dg/c1x-typedef-1.c: Expect errors for redefinitions of variably modified typedefs. * gcc.dg/c1x-typedef-2.c: Remove. Index: testsuite/gcc.dg/c1x-typedef-1.c =================================================================== --- testsuite/gcc.dg/c1x-typedef-1.c (revision 171110) +++ testsuite/gcc.dg/c1x-typedef-1.c (working copy) @@ -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" } */ } Index: testsuite/gcc.dg/c1x-typedef-2.c =================================================================== --- testsuite/gcc.dg/c1x-typedef-2.c (revision 171110) +++ testsuite/gcc.dg/c1x-typedef-2.c (working copy) @@ -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); -} Index: c-decl.c =================================================================== --- c-decl.c (revision 171110) +++ c-decl.c (working copy) @@ -1813,20 +1813,16 @@ diagnose_mismatched_decls (tree newdecl, || 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); } -- Joseph S. Myers jos...@codesourcery.com