aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-01-19 16:36:57 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-01-19 16:36:57 +0100
commitcfea9968d13cba69f32bf1e13126ed91fabfc02a (patch)
tree2e34cc53696dbe3ea19e2d94003b711402bc3676 /gcc
parentb899fd784b2e89080c853afd5bb1776328c9d4e7 (diff)
downloadgcc-cfea9968d13cba69f32bf1e13126ed91fabfc02a.zip
gcc-cfea9968d13cba69f32bf1e13126ed91fabfc02a.tar.gz
gcc-cfea9968d13cba69f32bf1e13126ed91fabfc02a.tar.bz2
re PR c++/47303 (ICE: in varpool_node, at varpool.c:134 with -fabi-version=1)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl2.c3
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/template/anonunion1.C24
5 files changed, 36 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2491047..a28d672 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 72570c3..2885528 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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;
}
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 16bd2a0..01f8cd7 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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).
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ef62c3c..0962b70 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..89a8c5b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/anonunion1.C
@@ -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>;