llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: 刘雨培 (LYP951018)

<details>
<summary>Changes</summary>

Currently, due to the incomplete implementation of p0588r1, the instantiation 
of lambda expressions leads to the instantiation of the body. And 
`EvaluateConstraints` is false during the instantiation of the body, which 
causes crashes during the instantiation of the return type requirement:

```cpp
template&lt;typename T&gt; concept doesnt_matter = true;

template&lt;class T&gt;
concept test = 
    []{
        return requires(T t) {
            { t } -&gt; doesnt_matter; // crash
        };
    }();

static_assert(test&lt;int&gt;);
```

 Although a complete implementation of p0588r1 can solve these crashes, it will 
take some time. Therefore, this pull request aims to fix these crashes first.

Fixes https://github.com/llvm/llvm-project/issues/63808, 
https://github.com/llvm/llvm-project/issues/64607, 
https://github.com/llvm/llvm-project/issues/64086


---
Full diff: https://github.com/llvm/llvm-project/pull/76967.diff


3 Files Affected:

- (modified) clang/docs/ReleaseNotes.rst (+3) 
- (modified) clang/lib/Sema/SemaTemplateInstantiate.cpp (+8) 
- (modified) clang/test/SemaTemplate/concepts-lambda.cpp (+33) 


``````````diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 30cfe66703f5a9..1815e8d69332e2 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -843,6 +843,9 @@ Bug Fixes to C++ Support
 - Fix crash when parsing nested requirement. Fixes:
   (`#73112 <https://github.com/llvm/llvm-project/issues/73112>`_)
 
+- Fixed a crash caused by using return type requirement in a lambda. Fixes:
+  (`#64607 <https://github.com/llvm/llvm-project/issues/64607>`_)
+
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 - Fixed an import failure of recursive friend class template.
diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp 
b/clang/lib/Sema/SemaTemplateInstantiate.cpp
index 37e5b9cad08bc9..bbaead33a6efe1 100644
--- a/clang/lib/Sema/SemaTemplateInstantiate.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp
@@ -1479,6 +1479,14 @@ namespace {
       return Result;
     }
 
+    StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body) {
+      bool Prev = EvaluateConstraints;
+      EvaluateConstraints = true;
+      StmtResult Stmt = inherited::TransformLambdaBody(E, Body);
+      EvaluateConstraints = Prev;
+      return Stmt;
+    }
+
     ExprResult TransformRequiresExpr(RequiresExpr *E) {
       LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
       ExprResult TransReq = inherited::TransformRequiresExpr(E);
diff --git a/clang/test/SemaTemplate/concepts-lambda.cpp 
b/clang/test/SemaTemplate/concepts-lambda.cpp
index 8a184cbf4e9bc2..0a58137055a381 100644
--- a/clang/test/SemaTemplate/concepts-lambda.cpp
+++ b/clang/test/SemaTemplate/concepts-lambda.cpp
@@ -116,3 +116,36 @@ static_assert(E<int>);
 // expected-note@-11{{because 'Q.template operator()<float>()' would be 
invalid: no matching member function for call to 'operator()'}}
 }
 }
+
+namespace ReturnTypeConstraintInLambda {
+template <typename T>
+concept C1 = true;
+
+template <class T>
+concept test = [] {
+  return requires(T t) {
+    { t } -> C1;
+  };
+}();
+
+static_assert(test<int>);
+
+template <typename T>
+concept C2 = true;
+struct S1 {
+  int f1() { return 1; }
+};
+
+void foo() {
+  auto make_caller = []<auto member> {
+    return [](S1 *ps) {
+      if constexpr (requires {
+                      { (ps->*member)() } -> C2;
+                    })
+        ;
+    };
+  };
+
+  auto caller = make_caller.operator()<&S1::f1>();
+}
+} // namespace ReturnTypeConstraintInLambda

``````````

</details>


https://github.com/llvm/llvm-project/pull/76967
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to