https://gcc.gnu.org/g:e13143ab02172adf7b9a4a848c5c17f62579b9cf

commit r14-11592-ge13143ab02172adf7b9a4a848c5c17f62579b9cf
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Apr 9 13:22:56 2025 -0400

    c++: lambda in constraint of lambda [PR119175]
    
    Here when we went to mangle the constraints of from<0>, the outer lambda has
    no mangling scope, but the inner one was treated as having the outer one as
    its scope.  And mangling the outer one means mangling its constraints, which
    include the inner one.  So infinite recursion.
    
    But a lambda closure type isn't a scope that anything should have for
    mangling, the inner lambda should also have no mangling scope.
    
            PR c++/119175
    
    gcc/cp/ChangeLog:
    
            * mangle.cc (decl_mangling_context): Look through lambda type.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/concepts-lambda23.C: New test.
    
    (cherry picked from commit 39892d9618ee0f06dd09271589878b0df7b1e75d)

Diff:
---
 gcc/cp/mangle.cc                               |  6 ++++++
 gcc/testsuite/g++.dg/cpp2a/concepts-lambda23.C | 12 ++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/gcc/cp/mangle.cc b/gcc/cp/mangle.cc
index 556f0db4269a..fe8e5a0fa288 100644
--- a/gcc/cp/mangle.cc
+++ b/gcc/cp/mangle.cc
@@ -1049,6 +1049,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 000000000000..f44212031dd7
--- /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<int = 0>
+static void from() requires requires {
+  []<int> requires requires { [] {}; } {};
+}
+{}
+
+int main() {
+  from();
+}

Reply via email to