diff mbox

[C++] Don't call mangle_decl on automatic anon union vars (PR c++/47303)

Message ID 20110117222422.GH2724@tyan-ft48-01.lab.bos.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Jan. 17, 2011, 10:24 p.m. UTC
Hi!

With -fabi-version=1 varpool_extra_name_alias called for G.need_abi_warning
by mangle_decl on automatic VAR_DECLs ICEs, as can be seen on the attached
testcase.  We could certainly not add the alias for automatic vars
in mangle_decl, but I wonder why we call mangle_decl on such vars at all.
The following patch was bootstrapped/regtested on x86_64-linux and
i686-linux, ok for trunk?

2011-01-17  Jakub Jelinek  <jakub@redhat.com>

	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.


	Jakub

Comments

Jason Merrill Jan. 19, 2011, 3:30 p.m. UTC | #1
OK.

Jason
diff mbox

Patch

--- gcc/cp/decl2.c.jj	2011-01-15 11:26:40.000000000 +0100
+++ gcc/cp/decl2.c	2011-01-17 20:14:03.424401617 +0100
@@ -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;
     }
 
--- gcc/testsuite/g++.dg/template/anonunion1.C.jj	2011-01-17 20:19:38.650429712 +0100
+++ gcc/testsuite/g++.dg/template/anonunion1.C	2011-01-17 20:17:51.000000000 +0100
@@ -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>;