tree result;
tree this_capture = LAMBDA_EXPR_THIS_CAPTURE (lambda);
+ if (this_capture)
+ if (tree spec = retrieve_local_specialization (this_capture))
+ {
+ gcc_checking_assert (generic_lambda_fn_p (lambda_function (lambda)));
+ this_capture = spec;
+ }
/* In unevaluated context this isn't an odr-use, so don't capture. */
if (cp_unevaluated_operand)
parser->omp_array_section_p = saved_omp_array_section_p;
}
- /* This field is only used during parsing of the lambda. */
- LAMBDA_EXPR_THIS_CAPTURE (lambda_expr) = NULL_TREE;
-
/* This lambda shouldn't have any proxies left at this point. */
gcc_assert (LAMBDA_EXPR_PENDING_PROXIES (lambda_expr) == NULL);
/* And now that we're done, push proxies for an enclosing lambda. */
else if (is_capture_proxy (DECL_EXPR_DECL (t)))
{
DECL_CONTEXT (decl) = current_function_decl;
- if (DECL_NAME (decl) == this_identifier)
- {
- tree lam = DECL_CONTEXT (current_function_decl);
- lam = CLASSTYPE_LAMBDA_EXPR (lam);
- LAMBDA_EXPR_THIS_CAPTURE (lam) = decl;
- }
insert_capture_proxy (decl);
}
else if (DECL_IMPLICIT_TYPEDEF_P (t))
LAMBDA_EXPR_REGEN_INFO (r)
= build_template_info (t, preserve_args (args));
- gcc_assert (LAMBDA_EXPR_THIS_CAPTURE (t) == NULL_TREE
- && LAMBDA_EXPR_PENDING_PROXIES (t) == NULL);
+ gcc_assert (LAMBDA_EXPR_PENDING_PROXIES (t) == NULL);
vec<tree,va_gc>* field_packs = NULL;
unsigned name_independent_cnt = 0;
LAMBDA_EXPR_CAPTURE_LIST (r)
= nreverse (LAMBDA_EXPR_CAPTURE_LIST (r));
- LAMBDA_EXPR_THIS_CAPTURE (r) = NULL_TREE;
-
maybe_add_lambda_conv_op (type);
}
--- /dev/null
+// PR c++/116756
+// { dg-do compile { target c++17 } }
+
+template<int N> struct cst { static constexpr int value = N; };
+
+struct Store {
+ void openDF() {
+ auto lambda = [this](auto& self, auto I) {
+ if constexpr (I.value == 0) {
+ auto next = [&self] { self(self, cst<1>{}); };
+ openSeries(next);
+ } else {
+ openSeries(0);
+ }
+ };
+ lambda(lambda, cst<0>{});
+ }
+ template<class T> void openSeries(T) { }
+};
+
+int main() {
+ Store store;
+ store.openDF();
+}