OSDN Git Service

PR c/46889
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 30 Dec 2010 18:24:03 +0000 (18:24 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 30 Dec 2010 18:24:03 +0000 (18:24 +0000)
* c-decl.c (detect_field_duplicates): Ensure hash is used for
finding duplicates when first field is anonymous.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168348 138bc75d-0d04-0410-961f-82ee72b054a4

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

index fbe61e3..8eff4b3 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-30  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/46889
+       * c-decl.c (detect_field_duplicates): Ensure hash is used for
+       finding duplicates when first field is anonymous.
+
 2010-12-30  Nathan Froyd  <froydnj@codesourcery.com>
 
         PR target/44606
index 40fccbe..4d24c60 100644 (file)
@@ -6805,11 +6805,9 @@ detect_field_duplicates (tree fieldlist)
 
   /* First, see if there are more than "a few" fields.
      This is trivially true if there are zero or one fields.  */
-  if (!fieldlist)
-    return;
-  x = DECL_CHAIN (fieldlist);
-  if (!x)
+  if (!fieldlist || !DECL_CHAIN (fieldlist))
     return;
+  x = fieldlist;
   do {
     timeout--;
     if (DECL_NAME (x) == NULL_TREE
index 25c2b8e..a14d416 100644 (file)
@@ -1,3 +1,8 @@
+2010-12-30  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/46889
+       * gcc.dg/anon-struct-15.c: New test.
+
 2010-12-30  Nathan Froyd  <froydnj@codesourcery.com>
 
         PR target/44606
diff --git a/gcc/testsuite/gcc.dg/anon-struct-15.c b/gcc/testsuite/gcc.dg/anon-struct-15.c
new file mode 100644 (file)
index 0000000..d9e786a
--- /dev/null
@@ -0,0 +1,16 @@
+/* Test diagnostics for duplicate field names involving anonymous
+   struct or union as first field.  PR 46889.  */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct foo {
+  union {
+    struct {
+      unsigned long time_stamp;
+    };
+    struct {
+      int *page;
+    };
+  };
+  int *page; /* { dg-error "duplicate member" } */
+};