+2017-08-23 Jason Merrill <jason@redhat.com>
+
+ * lambda.c (build_lambda_object): Check for error_mark_node.
+ * pt.c (make_pack_expansion): Set PACK_EXPANSION_LOCAL_P on the type
+ pack as well.
+ (tsubst_decl) [FUNCTION_DECL]: Set DECL_CONTEXT on the parameters.
+ (tsubst) [TEMPLATE_PARM_INDEX]: Check for error_mark_node.
+
2017-08-29 Jason Merrill <jason@redhat.com>
PR c++/80767 - unnecessary instantiation of generic lambda
{
if (!ctx->quiet)
{
- error_at (loc, "call to non-constexpr function %qD", fun);
+ if (!lambda_static_thunk_p (fun))
+ error_at (loc, "call to non-constexpr function %qD", fun);
explain_invalid_constexpr_fn (fun);
}
*non_constant_p = true;
purpose = cxx_make_type (TYPE_PACK_EXPANSION);
SET_PACK_EXPANSION_PATTERN (purpose, TREE_PURPOSE (arg));
PACK_EXPANSION_PARAMETER_PACKS (purpose) = parameter_packs;
+ PACK_EXPANSION_LOCAL_P (purpose) = at_function_scope_p ();
/* Just use structural equality for these TYPE_PACK_EXPANSIONS;
they will rarely be compared to anything. */
neglectable_inst_p (tree d)
{
return (DECL_P (d)
+ && !undeduced_auto_decl (d)
&& !(TREE_CODE (d) == FUNCTION_DECL ? DECL_DECLARED_CONSTEXPR_P (d)
: decl_maybe_constant_var_p (d)));
}
DECL_ARGUMENTS (r) = tsubst (DECL_ARGUMENTS (t), args,
complain, t);
+ for (tree parm = DECL_ARGUMENTS (r); parm; parm = DECL_CHAIN (parm))
+ DECL_CONTEXT (parm) = r;
DECL_RESULT (r) = NULL_TREE;
TREE_STATIC (r) = 0;
couldn't do it earlier because it might be an auto parameter,
and we wouldn't need to if we had an argument. */
type = tsubst (type, args, complain, in_decl);
+ if (type == error_mark_node)
+ return error_mark_node;
r = reduce_template_parm_level (t, type, levels, args, complain);
break;