return build2 (TEMPLATE_ID_EXPR, NULL_TREE, templ, arglist);
}
-/* Instantiate a variable declaration from a TEMPLATE_ID_EXPR for use. */
+/* Instantiate a variable declaration from a TEMPLATE_ID_EXPR if it's
+ not dependent. */
tree
finish_template_variable (tree var, tsubst_flags_t complain)
tree templ = TREE_OPERAND (var, 0);
tree arglist = TREE_OPERAND (var, 1);
+ /* If the template or arguments are dependent, then we
+ can't resolve the TEMPLATE_ID_EXPR yet. */
+ if (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (templ)) != 1
+ || any_dependent_template_arguments_p (arglist))
+ return var;
+
tree parms = DECL_TEMPLATE_PARMS (templ);
arglist = coerce_template_parms (parms, arglist, templ, complain);
if (arglist == error_mark_node)
tsubst_flags_t complain)
{
tree var = lookup_template_variable (templ, targs);
- if (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (templ)) == 1
- && !any_dependent_template_arguments_p (targs))
- {
- /* We may be called while doing a partial substitution, but the
- type of the variable template may be auto, in which case we
- will call do_auto_deduction in mark_used (which clears tf_partial)
- and the auto must be properly reduced at that time for the
- deduction to work. */
- complain &= ~tf_partial;
- var = finish_template_variable (var, complain);
- mark_used (var);
- }
-
+ /* We may be called while doing a partial substitution, but the
+ type of the variable template may be auto, in which case we
+ will call do_auto_deduction in mark_used (which clears tf_partial)
+ and the auto must be properly reduced at that time for the
+ deduction to work. */
+ complain &= ~tf_partial;
+ var = finish_template_variable (var, complain);
+ mark_used (var);
return convert_from_reference (var);
}
}
else
{
+ if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
+ && variable_template_p (TREE_OPERAND (decl, 0))
+ && !concept_check_p (decl))
+ /* Try resolving this variable TEMPLATE_ID_EXPR (which is always
+ considered type-dependent) now, so that the dependence test that
+ follows gives us the right answer: if it represents a non-dependent
+ variable template-id then finish_template_variable will yield the
+ corresponding non-dependent VAR_DECL. */
+ decl = finish_template_variable (decl);
+
bool dependent_p = type_dependent_expression_p (decl);
/* If the declaration was explicitly qualified indicate
/* Replace an evaluated use of the thread_local variable with
a call to its wrapper. */
decl = wrap;
- else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
- && !dependent_p
- && variable_template_p (TREE_OPERAND (decl, 0))
- && !concept_check_p (decl))
- {
- decl = finish_template_variable (decl);
- mark_used (decl);
- decl = convert_from_reference (decl);
- }
else if (concept_check_p (decl))
{
/* Nothing more to do. All of the analysis for concept checks