c++: nested generic lambda in DMI [PR101717]
We were already checking COMPLETE_TYPE_P to recognize instantiation of a generic lambda, but didn't consider that we might be nested in a non-generic lambda. PR c++/101717 gcc/cp/ChangeLog: * lambda.c (lambda_expr_this_capture): Check all enclosing lambdas for completeness. gcc/testsuite/ChangeLog: * g++.dg/cpp1y/lambda-generic-this4.C: New test.
This commit is contained in:
parent
45fb36bf93
commit
7ce3d2ab2a
|
@ -745,6 +745,7 @@ lambda_expr_this_capture (tree lambda, int add_capture_p)
|
|||
{
|
||||
tree lambda_stack = NULL_TREE;
|
||||
tree init = NULL_TREE;
|
||||
bool saw_complete = false;
|
||||
|
||||
/* If we are in a lambda function, we can move out until we hit:
|
||||
1. a non-lambda function or NSDMI,
|
||||
|
@ -763,6 +764,11 @@ lambda_expr_this_capture (tree lambda, int add_capture_p)
|
|||
lambda_stack);
|
||||
|
||||
tree closure = LAMBDA_EXPR_CLOSURE (tlambda);
|
||||
if (COMPLETE_TYPE_P (closure))
|
||||
/* We're instantiating a generic lambda op(), the containing
|
||||
scope may be gone. */
|
||||
saw_complete = true;
|
||||
|
||||
tree containing_function
|
||||
= decl_function_context (TYPE_NAME (closure));
|
||||
|
||||
|
@ -772,7 +778,7 @@ lambda_expr_this_capture (tree lambda, int add_capture_p)
|
|||
/* Lambda in an NSDMI. We don't have a function to look up
|
||||
'this' in, but we can find (or rebuild) the fake one from
|
||||
inject_this_parameter. */
|
||||
if (!containing_function && !COMPLETE_TYPE_P (closure))
|
||||
if (!containing_function && !saw_complete)
|
||||
/* If we're parsing a lambda in a non-local class,
|
||||
we can find the fake 'this' in scope_chain. */
|
||||
init = scope_chain->x_current_class_ptr;
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// PR c++/101717
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
struct x {
|
||||
static void f() { }
|
||||
void (*_)() = [] { [=](auto) { f(); }(0); };
|
||||
};
|
Loading…
Reference in New Issue