re PR c++/35315 (ICE with attribute transparent_union)
authorJason Merrill <jason@redhat.com>
Fri, 18 Mar 2011 15:06:41 +0000 (11:06 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 18 Mar 2011 15:06:41 +0000 (11:06 -0400)
PR c++/35315
* c-common.c (handle_transparent_union_attribute): Don't
make a duplicate type in C++.

From-SVN: r171145

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/attrib32.C

index a0268fd5b5bfd8a8281113e412fd05ed6e5df747..ca3db25b1cb68a53b7e8ba13c5aaacb042b1f2fd 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-18  Jason Merrill  <jason@redhat.com>
+
+       PR c++/35315
+       * c-common.c (handle_transparent_union_attribute): Don't
+       make a duplicate type in C++.
+
 2011-03-15  Jason Merrill  <jason@redhat.com>
 
        * c-common.c (max_constexpr_depth): New.
index 6674c58ffabe343a1537621559f65d90714a204f..799f8154936e87a98201aa011e87a1e05dff3d15 100644 (file)
@@ -6152,6 +6152,7 @@ handle_transparent_union_attribute (tree *node, tree name,
       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
        {
          if (TYPE_FIELDS (type) == NULL_TREE
+             || c_dialect_cxx ()
              || TYPE_MODE (type) != DECL_MODE (TYPE_FIELDS (type)))
            goto ignored;
 
index ac7e5ad62afb8f0a920f2306f6e5492f86bd56a4..dcd19eadd2625913968d22a7b20f0794624b7bfe 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-18  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/ext/attrib32.C: Expect errors on the two-names case.
+
 2011-03-18  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        PR middle-end/47405
index 77f71ded89d16794f92b9ed9083b995d0818c03e..e4dfe4e9f672d35185777d9dc5257c348168d383 100644 (file)
@@ -10,10 +10,10 @@ void bar()
   foo(0);
 }
 
-typedef union U1 { int i; } U2 __attribute__((transparent_union));
+typedef union U1 { int i; } U2 __attribute__((transparent_union)); // { dg-warning "ignored" }
 
-static void foo2(U1) {}
-static void foo2(U2) {}
+static void foo2(U1) {}                // { dg-error "previously defined" }
+static void foo2(U2) {}                // { dg-error "redefinition" }
 
 void bar2(U1 u1, U2 u2)
 {