This week's London WG14 meeting agreed to disallow the use of typedefs in declaring anonymous structure and union fields, as per N1549. This patch implements this, restricting the use of typedefs in this case to -fms-extensions and -fplan9-extensions as in 4.5 and earlier releases.
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? (The issue is about what is accepted by default rather than -std=c1x, since -std=c1x users in 4.6 should know it's experimental and subject to change.) 2011-03-18 Joseph Myers <jos...@codesourcery.com> * c-decl.c (grokfield): Don't allow typedefs for structures or unions with no tag by default. * doc/extend.texi (Unnamed Fields): Update. testsuite: 2011-03-18 Joseph Myers <jos...@codesourcery.com> * gcc.dg/c1x-anon-struct-1.c: Don't test use of typedefs. * gcc.dg/c1x-anon-struct-3.c: New test. * gcc.dg/anon-struct-11.c: Update. Index: doc/extend.texi =================================================================== --- doc/extend.texi (revision 171110) +++ doc/extend.texi (working copy) @@ -13352,12 +13352,11 @@ The compiler gives errors for such const @opindex fms-extensions Unless @option{-fms-extensions} is used, the unnamed field must be a structure or union definition without a tag (for example, @samp{struct -@{ int a; @};}), or a @code{typedef} name for such a structure or -union. If @option{-fms-extensions} is used, the field may +@{ int a; @};}). If @option{-fms-extensions} is used, the field may also be a definition with a tag such as @samp{struct foo @{ int a; @};}, a reference to a previously defined structure or union such as @samp{struct foo;}, or a reference to a @code{typedef} name for a -previously defined structure or union type with a tag. +previously defined structure or union type. @opindex fplan9-extensions The option @option{-fplan9-extensions} enables Index: testsuite/gcc.dg/c1x-anon-struct-3.c =================================================================== --- testsuite/gcc.dg/c1x-anon-struct-3.c (revision 0) +++ testsuite/gcc.dg/c1x-anon-struct-3.c (revision 0) @@ -0,0 +1,34 @@ +/* Test for anonymous structures and unions in C1X. Test for invalid + cases: typedefs disallowed by N1549. */ +/* { dg-do compile } */ +/* { dg-options "-std=c1x -pedantic-errors" } */ + +typedef struct +{ + int i; +} s0; + +typedef union +{ + int i; +} u0; + +struct s1 +{ + int a; + u0; /* { dg-error "declaration does not declare anything" } */ + struct + { + int b; + }; +}; + +union u1 +{ + int b; + s0; /* { dg-error "declaration does not declare anything" } */ + union + { + int c; + }; +}; Index: testsuite/gcc.dg/anon-struct-11.c =================================================================== --- testsuite/gcc.dg/anon-struct-11.c (revision 171110) +++ testsuite/gcc.dg/anon-struct-11.c (working copy) @@ -50,7 +50,7 @@ struct E { struct F { char f; }; /* { dg-warning "does not declare anything" } */ char c; union { - D; + D; /* { dg-warning "does not declare anything" } */ }; char e; }; @@ -85,7 +85,7 @@ test2 (void) e.e = 5; f2 (&e); /* { dg-warning "incompatible pointer type" } */ f3 (&e); /* { dg-warning "incompatible pointer type" } */ - if (e.d != 4) + if (e.d != 4) /* { dg-error "no member" } */ abort (); if (e.f != 6) /* { dg-error "no member" } */ abort (); Index: testsuite/gcc.dg/c1x-anon-struct-1.c =================================================================== --- testsuite/gcc.dg/c1x-anon-struct-1.c (revision 171110) +++ testsuite/gcc.dg/c1x-anon-struct-1.c (working copy) @@ -4,20 +4,13 @@ #include <stddef.h> -typedef struct -{ - int i; -} s0; - -typedef union -{ - int i; -} u0; - struct s1 { int a; - u0; + union + { + int i; + }; struct { int b; @@ -27,7 +20,10 @@ struct s1 union u1 { int b; - s0; + struct + { + int i; + }; union { int c; @@ -44,7 +40,10 @@ struct s2 struct s3 { - u0; + union + { + int i; + }; }; struct s4 Index: c-decl.c =================================================================== --- c-decl.c (revision 171110) +++ c-decl.c (working copy) @@ -6674,11 +6674,14 @@ grokfield (location_t loc, || TREE_CODE (type) == UNION_TYPE); bool ok = false; - if (type_ok) + if (type_ok + && (flag_ms_extensions + || flag_plan9_extensions + || !declspecs->typedef_p)) { if (flag_ms_extensions || flag_plan9_extensions) ok = true; - else if (TYPE_NAME (TYPE_MAIN_VARIANT (type)) == NULL) + else if (TYPE_NAME (type) == NULL) ok = true; else ok = false; -- Joseph S. Myers jos...@codesourcery.com