https://gcc.gnu.org/g:8bdbd3b73464f7b12b7d31af91660381be2b5e17

commit r12-11123-g8bdbd3b73464f7b12b7d31af91660381be2b5e17
Author: Jason Merrill <ja...@redhat.com>
Date:   Fri May 30 18:27:45 2025 -0400

    c++: lambda this capture and requires [PR120123]
    
    We shouldn't need to be within the lambda body to look through it to the
    enclosing non-static member function.
    
    This change is a small subset of r16-970.
    
            PR c++/120123
    
    gcc/cp/ChangeLog:
    
            * lambda.cc (nonlambda_method_basetype): Look through lambdas
            even when current_class_ref is null.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp2a/concepts-lambda24.C: New test.

Diff:
---
 gcc/cp/lambda.cc                               |  5 +----
 gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C | 13 +++++++++++++
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/gcc/cp/lambda.cc b/gcc/cp/lambda.cc
index 5bbdddfb0b9b..c380edd77486 100644
--- a/gcc/cp/lambda.cc
+++ b/gcc/cp/lambda.cc
@@ -975,12 +975,9 @@ current_nonlambda_function (void)
 tree
 nonlambda_method_basetype (void)
 {
-  if (!current_class_ref)
-    return NULL_TREE;
-
   tree type = current_class_type;
   if (!type || !LAMBDA_TYPE_P (type))
-    return type;
+    return current_class_ref ? type : NULL_TREE;
 
   while (true)
     {
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C 
b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C
new file mode 100644
index 000000000000..28f56ca2335e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-lambda24.C
@@ -0,0 +1,13 @@
+// PR c++/120123
+// { dg-do compile { target c++20 } }
+
+struct H {
+    void member(int) {}
+    void call() {
+        [this]() {
+            [this](const auto& v)
+                requires requires { /*this->*/member(v); }
+            { return member(v); }(0);
+        };
+    }
+};

Reply via email to