diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc index 02129c6b89a..3d5e96b2c94 100644 --- a/gcc/cp/mangle.cc +++ b/gcc/cp/mangle.cc @@ -1048,6 +1048,12 @@ decl_mangling_context (tree decl) tree extra = LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl)); if (extra) return extra; + tcontext = CP_DECL_CONTEXT (decl); + if (LAMBDA_TYPE_P (tcontext)) + /* Lambda type context means this lambda appears between the + lambda-introducer and the open brace of another lambda (c++/119175). + That isn't a real scope; look further into the enclosing scope. */ + return decl_mangling_context (TYPE_NAME (tcontext)); } else if (template_type_parameter_p (decl)) /* template type parms have no mangling context. */ diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-lambda23.C b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda23.C new file mode 100644 index 00000000000..f44212031dd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda23.C @@ -0,0 +1,12 @@ +// PR c++/119175 +// { dg-do compile { target c++20 } } + +template +static void from() requires requires { + [] requires requires { [] {}; } {}; +} +{} + +int main() { + from(); +}