2019-02-28 Jason Merrill <jason@redhat.com>
+ PR c++/86969 - ICE with constexpr if and recursive generic lambdas.
+ * class.c, lambda.c, pt.c: Revert earlier change.
+ * lambda.c (add_capture): Don't special-case capture of dependent
+ VLA.
+
* name-lookup.c (print_binding_level): Print this_entity.
2019-02-27 Marek Polacek <polacek@redhat.com>
an array of runtime length. */
static tree
-vla_capture_type (tree array_type, tree lambda)
+vla_capture_type (tree array_type)
{
- tree closure = LAMBDA_EXPR_CLOSURE (lambda);
- tree type = make_class_type (RECORD_TYPE);
- cp_binding_level *slev = current_binding_level;
- if (closure)
- {
- /* If we're already inside the lambda body, force the capture type out
- into the enclosing context, so we don't crash trying to instantiate
- the capture field in tsubst_lambda_expr. We won't have a TAG_DEFN
- from finish_struct in the enclosing context, which we work around in
- tsubst_lambda_expr. */
- TYPE_CONTEXT (type) = TYPE_CONTEXT (closure);
- cp_binding_level *b = current_binding_level;
- for (;; b = b->level_chain)
- if (b->this_entity == closure)
- {
- while (b->this_entity == closure)
- b = b->level_chain;
- break;
- }
- current_binding_level = b;
- }
- type = pushtag (make_anon_name (), type, ts_current);
- current_binding_level = slev;
+ tree type = xref_tag (record_type, make_anon_name (), ts_current, false);
xref_basetypes (type, NULL_TREE);
type = begin_class_definition (type);
if (!ptr_id)
if (type == error_mark_node)
return error_mark_node;
- if (array_of_runtime_bound_p (type))
+ if (!dependent_type_p (type) && array_of_runtime_bound_p (type))
{
vla = true;
if (!by_reference_p)
initializer = build_constructor_va (init_list_type_node, 2,
NULL_TREE, build_address (elt),
NULL_TREE, array_type_nelts (type));
- type = vla_capture_type (type, lambda);
+ type = vla_capture_type (type);
}
else if (!dependent_type_p (type)
&& variably_modified_type_p (type, NULL_TREE))
if (PACK_EXPANSION_P (ofield))
ofield = PACK_EXPANSION_PATTERN (ofield);
tree field = tsubst_decl (ofield, args, complain);
- if (DECL_VLA_CAPTURE_P (ofield))
- /* The type of a VLA capture might not have a TAG_DEFN in the enclosing
- context, so complete it here. */
- complete_type (TREE_TYPE (field));
if (DECL_PACK_P (ofield) && !DECL_NORMAL_CAPTURE_P (ofield))
{