From d0e9101d9f1e49c828a0a88a04c2abde46bec88d Mon Sep 17 00:00:00 2001 From: Younan Zhang Date: Wed, 7 Feb 2024 08:11:28 +0800 Subject: [PATCH] PR for llvm/llvm-project#79568 (#80120) Backporting https://github.com/llvm/llvm-project/pull/79568 to clang 18. --- clang/docs/ReleaseNotes.rst | 5 +++++ clang/lib/Sema/SemaConcept.cpp | 8 ++++++-- clang/test/SemaTemplate/concepts-lambda.cpp | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3ec187058db42a..0c187d5e0dc1ad 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -1054,6 +1054,11 @@ Bug Fixes to C++ Support Fixes (`#78830 `_) Fixes (`#60085 `_) + +- Fixed a bug where variables referenced by requires-clauses inside + nested generic lambdas were not properly injected into the constraint scope. + (`#73418 `_) + - Fix incorrect code generation caused by the object argument of ``static operator()`` and ``static operator[]`` calls not being evaluated. Fixes (`#67976 `_) diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index acfc00f4125407..88fc846c89e42c 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -612,8 +612,12 @@ bool Sema::SetupConstraintScope( // If this is a member function, make sure we get the parameters that // reference the original primary template. - if (const auto *FromMemTempl = - PrimaryTemplate->getInstantiatedFromMemberTemplate()) { + // We walk up the instantiated template chain so that nested lambdas get + // handled properly. + for (FunctionTemplateDecl *FromMemTempl = + PrimaryTemplate->getInstantiatedFromMemberTemplate(); + FromMemTempl; + FromMemTempl = FromMemTempl->getInstantiatedFromMemberTemplate()) { if (addInstantiatedParametersToScope(FD, FromMemTempl->getTemplatedDecl(), Scope, MLTAL)) return true; diff --git a/clang/test/SemaTemplate/concepts-lambda.cpp b/clang/test/SemaTemplate/concepts-lambda.cpp index 7e431529427dff..0b7580f91043c7 100644 --- a/clang/test/SemaTemplate/concepts-lambda.cpp +++ b/clang/test/SemaTemplate/concepts-lambda.cpp @@ -149,3 +149,21 @@ void foo() { auto caller = make_caller.operator()<&S1::f1>(); } } // namespace ReturnTypeRequirementInLambda + +namespace GH73418 { +void foo() { + int x; + [&x](auto) { + return [](auto y) { + return [](auto obj, auto... params) + requires requires { + sizeof...(params); + [](auto... pack) { + return sizeof...(pack); + }(params...); + } + { return false; }(y); + }(x); + }(x); +} +} // namespace GH73418