re PR c/17189 (bogus warning for struct Foo { int; };)
authorJoseph Myers <jsm@polyomino.org.uk>
Sun, 10 Oct 2004 00:47:20 +0000 (01:47 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Sun, 10 Oct 2004 00:47:20 +0000 (01:47 +0100)
PR c/17189
* c-decl.c (grokfield): Make diagnostic for bad cases of unnamed
fields a pedwarn.  Pedwarn here for unnamed structs/unions if
pedantic.
* c-parse.in (component_decl): Don't pedwarn here for unnamed
fields.

testsuite:
* gcc.dg/anon-struct-5.c: New test.

From-SVN: r88834

gcc/ChangeLog
gcc/c-decl.c
gcc/c-parse.in
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/anon-struct-5.c [new file with mode: 0644]

index d2c0bae..2437467 100644 (file)
@@ -1,3 +1,12 @@
+2004-10-10  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       PR c/17189
+       * c-decl.c (grokfield): Make diagnostic for bad cases of unnamed
+       fields a pedwarn.  Pedwarn here for unnamed structs/unions if
+       pedantic.
+       * c-parse.in (component_decl): Don't pedwarn here for unnamed
+       fields.
+
 2004-10-09  Zdenek Dvorak  <dvorakz@suse.cz>
 
        PR tree-optimization/17906
index a723c25..f2f9a27 100644 (file)
@@ -5003,27 +5003,29 @@ grokfield (struct c_declarator *declarator, struct c_declspecs *declspecs,
         that took root before someone noticed the bug...  */
 
       tree type = declspecs->type;
+      bool type_ok = (TREE_CODE (type) == RECORD_TYPE
+                     || TREE_CODE (type) == UNION_TYPE);
+      bool ok = false;
 
-      if (type
-         && (TREE_CODE (type) == RECORD_TYPE
-             || TREE_CODE (type) == UNION_TYPE)
+      if (type_ok
          && (flag_ms_extensions || !declspecs->typedef_p))
        {
          if (flag_ms_extensions)
-           ; /* ok */
+           ok = true;
          else if (flag_iso)
-           goto warn_unnamed_field;
+           ok = false;
          else if (TYPE_NAME (type) == NULL)
-           ; /* ok */
+           ok = true;
          else
-           goto warn_unnamed_field;
+           ok = false;
        }
-      else
+      if (!ok)
        {
-       warn_unnamed_field:
-         warning ("declaration does not declare anything");
+         pedwarn ("declaration does not declare anything");
          return NULL_TREE;
        }
+      if (pedantic)
+       pedwarn ("ISO C doesn't support unnamed structs/unions");
     }
 
   value = grokdeclarator (declarator, declspecs, FIELD, false,
index 3defcd0..e469677 100644 (file)
@@ -1738,9 +1738,6 @@ component_decl:
                  /* Support for unnamed structs or unions as members of
                     structs or unions (which is [a] useful and [b] supports
                     MS P-SDK).  */
-                 if (pedantic)
-                   pedwarn ("ISO C doesn't support unnamed structs/unions");
-
                  $$ = grokfield (build_id_declarator (NULL_TREE),
                                  current_declspecs, NULL_TREE);
                  POP_DECLSPEC_STACK; }
index bb101fd..dd56e1b 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-10  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       PR c/17189
+       * gcc.dg/anon-struct-5.c: New test.
+
 2004-10-09  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        PR c/17844
diff --git a/gcc/testsuite/gcc.dg/anon-struct-5.c b/gcc/testsuite/gcc.dg/anon-struct-5.c
new file mode 100644 (file)
index 0000000..f7d1278
--- /dev/null
@@ -0,0 +1,7 @@
+/* Test bad warning for anonymous int in structure.  Bug 17189.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+
+struct Foo { int; }; /* { dg-bogus "unnamed" } */
+/* { dg-error "error: declaration does not declare anything" "int;" { target *-*-* } 5 } */
+/* { dg-error "error: struct has no members" "no members" { target *-*-* } 5 } */