diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2ed9f15c366f..f356caa6c84a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-06-03 Jason Merrill + PR c++/60992 + * pt.c (tsubst_copy) [VAR_DECL]: Try lookup first. Add a new + variable to local_specializations. + PR c++/60848 * call.c (is_std_init_list): Check CLASSTYPE_TEMPLATE_INFO. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d267a5c1d924..885890890664 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12730,14 +12730,19 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) r = retrieve_local_specialization (t); if (r == NULL_TREE) { - if (DECL_ANON_UNION_VAR_P (t)) + /* First try name lookup to find the instantiation. */ + r = lookup_name (DECL_NAME (t)); + if (r) { - /* 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); + /* Make sure that the one we found is the one we want. */ + tree ctx = tsubst (DECL_CONTEXT (t), args, + complain, in_decl); + if (ctx != DECL_CONTEXT (r)) + r = NULL_TREE; } + + if (r) + /* OK */; else { /* This can happen for a variable used in a @@ -12771,10 +12776,12 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) else if (decl_constant_var_p (r)) /* A use of a local constant decays to its value. FIXME update for core DR 696. */ - return integral_constant_value (r); + r = integral_constant_value (r); } - return r; } + /* Remember this for subsequent uses. */ + if (local_specializations) + register_local_specialization (r, t); } } else