From: Jason Merrill Date: Thu, 13 Sep 2012 15:13:08 +0000 (-0400) Subject: re PR c++/54511 (internal compiler error: in make_decl_rtl, at varasm.c:1147) X-Git-Tag: releases/gcc-4.6.4~371 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2ae6a9f5289ac0b82125d4946ffb2b816821460;p=thirdparty%2Fgcc.git re PR c++/54511 (internal compiler error: in make_decl_rtl, at varasm.c:1147) PR c++/54511 * pt.c (tsubst_decl) [VAR_DECL]: Handle DECL_ANON_UNION_VAR_P. From-SVN: r191260 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c53875116798..e3208d9ebe1d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2012-09-13 Jason Merrill + + PR c++/54511 + * pt.c (tsubst_decl) [VAR_DECL]: Handle DECL_ANON_UNION_VAR_P. + 2012-06-25 Jason Merrill PR c++/52988 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4defa853eaa6..42e8a5972be7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10028,6 +10028,16 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) break; } + if (TREE_CODE (t) == VAR_DECL && DECL_ANON_UNION_VAR_P (t)) + { + /* Just use name lookup to find a member alias for an anonymous + union, but then add it to the hash table. */ + r = lookup_name (DECL_NAME (t)); + gcc_assert (DECL_ANON_UNION_VAR_P (r)); + register_local_specialization (r, t); + break; + } + /* Create a new node for the specialization we need. */ r = copy_decl (t); if (type == NULL_TREE) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa13012bb43c..759e32f6a85f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-09-13 Jason Merrill + + PR c++/54511 + * g++.dg/template/anonunion2.C: New. + 2012-09-12 Mikael Morin PR fortran/54208 diff --git a/gcc/testsuite/g++.dg/template/anonunion2.C b/gcc/testsuite/g++.dg/template/anonunion2.C new file mode 100644 index 000000000000..cb3c12dff1ed --- /dev/null +++ b/gcc/testsuite/g++.dg/template/anonunion2.C @@ -0,0 +1,6 @@ +template +struct S +{ + S () { union { int a; }; a = 0; } +}; +S<0> s;