[clang] [Clang] Recover GLTemplateParameterList for generic lambdas in RebuildLambdaScopeInfo (PR #118176)
Younan Zhang via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 2 17:41:43 PST 2024
https://github.com/zyn0217 updated https://github.com/llvm/llvm-project/pull/118176
>From 6d55d79dc7a67a94be0f72b15f8da90813ebb9fd Mon Sep 17 00:00:00 2001
From: Younan Zhang <zyn7109 at gmail.com>
Date: Sat, 30 Nov 2024 23:23:47 +0800
Subject: [PATCH 1/2] [Clang] Recover GLTemplateParameterList for generic
lambdas in RebuildLambdaScopeInfo
---
clang/docs/ReleaseNotes.rst | 2 ++
clang/lib/Sema/SemaDecl.cpp | 21 ++++++++++++++++---
.../SemaCXX/lambda-capture-type-deduction.cpp | 16 ++++++++++++++
3 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8bd06fadfdc984..e8e8a8cff76e45 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -714,6 +714,8 @@ Bug Fixes to C++ Support
assumption if they also occur inside of a dependent lambda. (#GH114787)
- Clang now uses valid deduced type locations when diagnosing functions with trailing return type
missing placeholder return type. (#GH78694)
+- Fixed an incorrect lambda scope of generic lambdas that caused Clang to crash when computing potential lambda
+ captures at the end of a full expression. (#GH115931)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 74b0e5ad23bd48..75389d6ba7bfd8 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -15504,10 +15504,25 @@ LambdaScopeInfo *Sema::RebuildLambdaScopeInfo(CXXMethodDecl *CallOperator) {
LSI->CallOperator = CallOperator;
LSI->Lambda = LambdaClass;
LSI->ReturnType = CallOperator->getReturnType();
- // This function in calls in situation where the context of the call operator
- // is not entered, so we set AfterParameterList to false, so that
+ // When this function is called in situation where the context of the call
+ // operator is not entered, we set AfterParameterList to false, so that
// `tryCaptureVariable` finds explicit captures in the appropriate context.
- LSI->AfterParameterList = false;
+ //
+ // There is also at least a situation as in FinishTemplateArgumentDeduction(),
+ // where we would set the CurContext to the lambda operator before
+ // substituting into it. In this case the flag needs to be true such that
+ // tryCaptureVariable can correctly handle potential captures thereof.
+ LSI->AfterParameterList = CurContext == CallOperator;
+ // GLTemplateParameterList is necessary for getCurGenericLambda() which is
+ // used at the point of dealing with potential captures.
+ //
+ // We don't use LambdaClass->isGenericLambda() because this value doesn't
+ // flip for instantiated generic lambdas, where no FunctionTemplateDecls are
+ // associated. (Technically, we could recover that list from their
+ // instantiation patterns, but for now, the GLTemplateParameterList seems
+ // unnecessary in these cases.)
+ if (FunctionTemplateDecl *FTD = CallOperator->getDescribedFunctionTemplate())
+ LSI->GLTemplateParameterList = FTD->getTemplateParameters();
const LambdaCaptureDefault LCD = LambdaClass->getLambdaCaptureDefault();
if (LCD == LCD_None)
diff --git a/clang/test/SemaCXX/lambda-capture-type-deduction.cpp b/clang/test/SemaCXX/lambda-capture-type-deduction.cpp
index a86f3018989927..234cb6806f041a 100644
--- a/clang/test/SemaCXX/lambda-capture-type-deduction.cpp
+++ b/clang/test/SemaCXX/lambda-capture-type-deduction.cpp
@@ -298,6 +298,22 @@ void __trans_tmp_1() {
}
+namespace GH115931 {
+
+struct Range {};
+
+template <Range>
+struct LengthPercentage {};
+
+void reflectSum() {
+ Range resultR;
+ [&] (auto) -> LengthPercentage<resultR> {
+ return {};
+ }(0);
+}
+
+} // namespace GH115931
+
namespace GH47400 {
struct Foo {};
>From 1370880d15472d8f587b730c37ed6d51ad539dce Mon Sep 17 00:00:00 2001
From: Younan Zhang <zyn7109 at gmail.com>
Date: Tue, 3 Dec 2024 09:41:19 +0800
Subject: [PATCH 2/2] Address feedback
---
clang/lib/Sema/SemaDecl.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 10a933077b5111..c4bb73b2924bc9 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -15522,12 +15522,12 @@ LambdaScopeInfo *Sema::RebuildLambdaScopeInfo(CXXMethodDecl *CallOperator) {
// When this function is called in situation where the context of the call
// operator is not entered, we set AfterParameterList to false, so that
// `tryCaptureVariable` finds explicit captures in the appropriate context.
- //
// There is also at least a situation as in FinishTemplateArgumentDeduction(),
// where we would set the CurContext to the lambda operator before
// substituting into it. In this case the flag needs to be true such that
// tryCaptureVariable can correctly handle potential captures thereof.
LSI->AfterParameterList = CurContext == CallOperator;
+
// GLTemplateParameterList is necessary for getCurGenericLambda() which is
// used at the point of dealing with potential captures.
//
More information about the cfe-commits
mailing list