re PR c++/47303 (ICE: in varpool_node, at varpool.c:134 with -fabi-version=1)
authorJakub Jelinek <jakub@redhat.com>
Wed, 19 Jan 2011 15:36:57 +0000 (16:36 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 19 Jan 2011 15:36:57 +0000 (16:36 +0100)
PR c++/47303
* decl2.c (finish_anon_union): Only call mangle_decl if TREE_STATIC
or DECL_EXTERNAL.

* g++.dg/template/anonunion1.C: New test.

From-SVN: r169000

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/anonunion1.C [new file with mode: 0644]

index 249104773f6365dafd2dda0184610606b89ffe6a..a28d672767517b2bd1bdd52f75a03fdc0b345875 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/47303
+       * decl2.c (finish_anon_union): Only call mangle_decl if TREE_STATIC
+       or DECL_EXTERNAL.
+
 2011-01-17  Jason Merrill  <jason@redhat.com>
 
        PR c++/47067
index 72570c3cbb6a9833efe10e18d736bd0cb1713d7e..288552880a77bd056a38f50c1198e8decf949029 100644 (file)
@@ -1409,7 +1409,8 @@ finish_anon_union (tree anon_union_decl)
       /* Use main_decl to set the mangled name.  */
       DECL_NAME (anon_union_decl) = DECL_NAME (main_decl);
       maybe_commonize_var (anon_union_decl);
-      mangle_decl (anon_union_decl);
+      if (TREE_STATIC (anon_union_decl) || DECL_EXTERNAL (anon_union_decl))
+       mangle_decl (anon_union_decl);
       DECL_NAME (anon_union_decl) = NULL_TREE;
     }
 
index 16bd2a0b88eed0cc41c96bbb0cc4e5b2a3181020..01f8cd772fb75afdf34a33127b57a8d4dcff13db 100644 (file)
@@ -1,6 +1,6 @@
 /* Handle parameterized types (templates) for GNU C++.
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+   2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.
    Rewritten by Jason Merrill (jason@cygnus.com).
index ef62c3c9b02f7e509a928f54c8f64a75ef6ef561..0962b7020b0723c36ed1d69373aec17567662cd9 100644 (file)
@@ -1,5 +1,8 @@
 2011-01-19  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/47303
+       * g++.dg/template/anonunion1.C: New test.
+
        PR rtl-optimization/47337
        * gcc.c-torture/execute/pr47337.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/template/anonunion1.C b/gcc/testsuite/g++.dg/template/anonunion1.C
new file mode 100644 (file)
index 0000000..89a8c5b
--- /dev/null
@@ -0,0 +1,24 @@
+// PR c++/47303
+// { dg-do compile }
+// { dg-options "-fabi-version=1" }
+
+struct Z
+{
+  void foo (int);
+};
+
+struct F
+{
+  typedef void (Z::*zm) (int);
+  typedef void (F::*fm) (int);
+  template <zm>
+  void bar (int)
+  {
+    union
+    {
+      Z z;
+    };
+  }
+};
+
+F::fm m = &F::bar <&Z::foo>;