From: Jason Merrill Date: Thu, 13 Sep 2012 15:13:45 +0000 (-0400) Subject: re PR c++/54511 (internal compiler error: in make_decl_rtl, at varasm.c:1147) X-Git-Tag: misc/gccgo-go1_1_2~897 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=afcf5b8e90cde4d5e61785464c3928fb9c965499;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: r191262 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b7d8a1d43d5e..6d135a35b44b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2012-09-13 Jason Merrill + PR c++/54511 + * pt.c (tsubst_decl) [VAR_DECL]: Handle DECL_ANON_UNION_VAR_P. + PR c++/53836 * pt.c (value_dependent_expression_p): A TREE_LIST initializer must be dependent. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4cf2ed8917bd..5b7976ae964e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10443,6 +10443,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 debdd885c303..3b813a3f0148 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2012-09-13 Jason Merrill + PR c++/54511 + * g++.dg/template/anonunion2.C: New. + PR c++/53836 * g++.dg/template/init10.C: New. 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;