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<typename T> concept doesnt_matter = true; template<class T> concept test = []{ return requires(T t) { { t } -> doesnt_matter; // crash }; }(); static_assert(test<int>); ``` 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