===================================================================
@@ -7861,6 +7861,10 @@ for_each_template_parm_r (tree *tp, int *walk_subt
&& for_each_template_parm (DECL_CONTEXT (t), fn, data,
pfd->visited, pfd->include_nondeduced_p))
return error_mark_node;
+ if (!fn && TREE_TYPE (t)
+ && for_each_template_parm (TREE_TYPE(t), fn, data,
+ pfd->visited, pfd->include_nondeduced_p))
+ return error_mark_node;
break;
case BOUND_TEMPLATE_TEMPLATE_PARM:
@@ -7905,6 +7909,11 @@ for_each_template_parm_r (tree *tp, int *walk_subt
(TREE_TYPE (t)), fn, data,
pfd->visited, pfd->include_nondeduced_p))
return error_mark_node;
+ else if (!fn && TREE_TYPE (t)
+ && for_each_template_parm (TREE_TYPE (t), fn,
+ data, pfd->visited,
+ pfd->include_nondeduced_p))
+ return error_mark_node;
break;
case INDIRECT_REF:
@@ -7913,6 +7922,10 @@ for_each_template_parm_r (tree *tp, int *walk_subt
involving template parameters. */
if (!fn && !TREE_TYPE (t))
return error_mark_node;
+ else if (!fn && for_each_template_parm (TREE_TYPE (t), fn,
+ data, pfd->visited,
+ pfd->include_nondeduced_p))
+ return error_mark_node;
break;
case MODOP_EXPR:
@@ -19744,6 +19757,29 @@ type_dependent_expression_p (tree expression)
return (dependent_type_p (TREE_TYPE (expression)));
}
+/* Returns TRUE if the EXPRESSION is instantiation-dependent, in the
+ sense defined by the ABI:
+
+ "An expression is instantiation-dependent if it is type-dependent
+ or value-dependent, or it has a subexpression that is type-dependent
+ or value-dependent." */
+
+bool
+instantiation_dependent_expression_p (tree expression)
+{
+ if (!processing_template_decl)
+ return false;
+
+ if (expression == error_mark_node)
+ return false;
+
+ if (!TREE_TYPE (expression))
+ return true;
+
+ return for_each_template_parm (expression, NULL, NULL, NULL,
+ /*include_nondeduced_p=*/true);
+}
+
/* Like type_dependent_expression_p, but it also works while not processing
a template definition, i.e. during substitution or mangling. */
===================================================================
@@ -5168,8 +5168,7 @@ finish_decltype_type (tree expr, bool id_expressio
return error_mark_node;
}
- /* FIXME instantiation-dependent */
- if (type_dependent_expression_p (expr)
+ if (instantiation_dependent_expression_p (expr)
/* In a template, a COMPONENT_REF has an IDENTIFIER_NODE for op1 even
if it isn't dependent, so that we can check access control at
instantiation time, so defer the decltype as well (PR 42277). */
===================================================================
@@ -5363,6 +5363,7 @@ extern bool any_type_dependent_arguments_p (c
extern bool any_type_dependent_elements_p (const_tree);
extern bool type_dependent_expression_p_push (tree);
extern bool value_dependent_expression_p (tree);
+extern bool instantiation_dependent_expression_p(tree);
extern bool any_value_dependent_elements_p (const_tree);
extern bool dependent_omp_for_p (tree, tree, tree, tree);
extern tree resolve_typename_type (tree, bool);