From cfea9968d13cba69f32bf1e13126ed91fabfc02a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 19 Jan 2011 16:36:57 +0100 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl2.c | 3 ++- gcc/cp/pt.c | 2 +- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/template/anonunion1.C | 24 ++++++++++++++++++++++ 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/anonunion1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 249104773f6..a28d6727675 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-01-19 Jakub Jelinek + + PR c++/47303 + * decl2.c (finish_anon_union): Only call mangle_decl if TREE_STATIC + or DECL_EXTERNAL. + 2011-01-17 Jason Merrill PR c++/47067 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 72570c3cbb6..288552880a7 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 16bd2a0b88e..01f8cd772fb 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 ef62c3c9b02..0962b7020b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-01-19 Jakub Jelinek + 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 00000000000..89a8c5bec9c --- /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 + void bar (int) + { + union + { + Z z; + }; + } +}; + +F::fm m = &F::bar <&Z::foo>;