2014-06-03 Jason Merrill <jason@redhat.com>
+ 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.
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
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