diff options
author | Joseph Myers <joseph@codesourcery.com> | 2011-03-18 21:16:31 +0000 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2011-03-18 21:16:31 +0000 |
commit | ff8e21599213bbea6ccacecf2522ad19836c8fd1 (patch) | |
tree | 080d7b0817fada736ec3b580f8573b09cf4c52d1 /gcc | |
parent | 16cc44407fe40e3411e206eeec60a14d20769ade (diff) | |
download | gcc-ff8e21599213bbea6ccacecf2522ad19836c8fd1.zip gcc-ff8e21599213bbea6ccacecf2522ad19836c8fd1.tar.gz gcc-ff8e21599213bbea6ccacecf2522ad19836c8fd1.tar.bz2 |
c-decl.c (grokfield): Don't allow typedefs for structures or unions with no tag by default.
* c-decl.c (grokfield): Don't allow typedefs for structures or
unions with no tag by default.
* doc/extend.texi (Unnamed Fields): Update.
testsuite:
* 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.
From-SVN: r171170
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-decl.c | 7 | ||||
-rw-r--r-- | gcc/doc/extend.texi | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/anon-struct-11.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/c1x-anon-struct-1.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/c1x-anon-struct-3.c | 34 |
7 files changed, 67 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 762dbb4..b6680a9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-03-18 Joseph Myers <joseph@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. + 2011-03-18 Uros Bizjak <ubizjak@gmail.com> * config/i386/i386.md (float<SSEMODEI24:mode><X87MODEF:mode>2): diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b438b06..8f9c444 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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; diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index eaad089..c897101 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -13352,12 +13352,11 @@ The compiler gives errors for such constructs. @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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5c39684..3cda22b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-03-18 Joseph Myers <joseph@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. + 2011-03-18 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * gcc.dg/vect/slp-multitypes-2.c: Replace dg-do run with diff --git a/gcc/testsuite/gcc.dg/anon-struct-11.c b/gcc/testsuite/gcc.dg/anon-struct-11.c index 1084e5b..c2f85fc 100644 --- a/gcc/testsuite/gcc.dg/anon-struct-11.c +++ b/gcc/testsuite/gcc.dg/anon-struct-11.c @@ -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 (); diff --git a/gcc/testsuite/gcc.dg/c1x-anon-struct-1.c b/gcc/testsuite/gcc.dg/c1x-anon-struct-1.c index 711fe65..6d4b433 100644 --- a/gcc/testsuite/gcc.dg/c1x-anon-struct-1.c +++ b/gcc/testsuite/gcc.dg/c1x-anon-struct-1.c @@ -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 diff --git a/gcc/testsuite/gcc.dg/c1x-anon-struct-3.c b/gcc/testsuite/gcc.dg/c1x-anon-struct-3.c new file mode 100644 index 0000000..1841edd --- /dev/null +++ b/gcc/testsuite/gcc.dg/c1x-anon-struct-3.c @@ -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; + }; +}; |