[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky closed https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
@@ -13714,6 +13714,12 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // We need ThisType when build capture in CheckCXXThisCapture. jcsxky wrote: Thanks for your patience! https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
Sirraide wrote: CI for the docs seems to be broken because of something clang-format related; the changes to the docs here are trivial, so we should just be able to ignore that. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/Sirraide approved this pull request. LGTM https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
@@ -13714,6 +13714,12 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // We need ThisType when build capture in CheckCXXThisCapture. Sirraide wrote: No problem—writing descriptive comments is hard; I had to think a while about how to phrase this, and I don’t think the way I phrased it is ideal either, but it’s hopefully good enough. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
@@ -13714,6 +13714,12 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // We need ThisType when build capture in CheckCXXThisCapture. jcsxky wrote: Ah, I see. I didn't realize to combine test case with the comment to have a better illustration. Sorry for my poor English and expression! I have pushed your suggestion. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/85565 >From b286dcfb2ae59d650e6b49fee97f159e2e958dcc Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 17 Mar 2024 17:48:05 +0800 Subject: [PATCH] [Clang][Sema] Fix a crash in lambda instantiation --- clang/docs/ReleaseNotes.rst| 1 + clang/lib/Sema/TreeTransform.h | 10 ++ clang/test/Sema/PR85343.cpp| 22 ++ 3 files changed, 33 insertions(+) create mode 100644 clang/test/Sema/PR85343.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 125d51c42d507f..a446fd203e0f8c 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -394,6 +394,7 @@ Bug Fixes to C++ Support expression references to an entity declared outside of the lambda. (#GH64808) - Clang's __builtin_bit_cast will now produce a constant value for records with empty bases. See: (#GH82383) +- Fix a crash when instantiating a lambda that captures ``this`` outside of its context. Fixes (#GH85343). Bug Fixes to AST Handling ^ diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 2d22692f3ab750..f2f7d7ab9c7c38 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13714,6 +13714,16 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // If this is a lambda that is part of a default member initialiser + // and which we're instantiating outside the class that 'this' is + // supposed to refer to, adjust the type of 'this' accordingly. + // + // Otherwise, leave the type of 'this' as-is. + Sema::CXXThisScopeRAII ThisScope( + getSema(), + dyn_cast_if_present( + getSema().getFunctionLevelDeclContext()), + Qualifiers()); getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), /*BuildAndDiagnose*/ true, nullptr, C->getCaptureKind() == LCK_StarThis); diff --git a/clang/test/Sema/PR85343.cpp b/clang/test/Sema/PR85343.cpp new file mode 100644 index 00..d90ef19d423455 --- /dev/null +++ b/clang/test/Sema/PR85343.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++14 -verify %s +// expected-no-diagnostics + +template auto ab() -> c ; + +template struct e {}; + +template struct ac { + template static e()(ab))> i; + decltype(i) j; +}; + +struct d { + template + d(f) { +ac a; + } +}; +struct a { + d b = [=](auto) { (void)[this] {}; }; +}; +void b() { new a; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
@@ -13714,6 +13714,12 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // We need ThisType when build capture in CheckCXXThisCapture. Sirraide wrote: ```suggestion // If this is a lambda that is part of a default member initialiser // and which we're instantiating outside the class that 'this' is // supposed to refer to, adjust the type of 'this' accordingly. // // Otherwise, leave the type of 'this' as-is. ``` This still only describes *what* we’re doing below, not *why*; what I meant was that we should point out that the reason why we’re pushing a `this` scope here is because we may not be inside the class that `this` is supposed to refer to here; I’d suggest something like this perhaps. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/Sirraide edited https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/Sirraide requested changes to this pull request. LGTM except that the comment could still be worded a bit better—especially since I had to take another look at how this here works exactly, but I believe that this is correct: `CXXThisScopeRAII` does nothing if the context that it is passed is null, and `getFunctionLevelDeclContext` stops if it finds a `CXXRecordDecl`, so this should be nonnull iff this lambda is in a class but outside a member function. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
jcsxky wrote: @Sirraide Very thankful for your comments and it really makes the description more clear and easy to be understood! I have updated this patch following your suggestion and please take another look. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/85565 >From e94505fa77155cb0bbdf3ef92a426ef070cb3833 Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 17 Mar 2024 17:48:05 +0800 Subject: [PATCH] [Clang][Sema] Fix a crash in lambda instantiation --- clang/docs/ReleaseNotes.rst| 1 + clang/lib/Sema/TreeTransform.h | 6 ++ clang/test/Sema/PR85343.cpp| 22 ++ 3 files changed, 29 insertions(+) create mode 100644 clang/test/Sema/PR85343.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 125d51c42d507f..a446fd203e0f8c 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -394,6 +394,7 @@ Bug Fixes to C++ Support expression references to an entity declared outside of the lambda. (#GH64808) - Clang's __builtin_bit_cast will now produce a constant value for records with empty bases. See: (#GH82383) +- Fix a crash when instantiating a lambda that captures ``this`` outside of its context. Fixes (#GH85343). Bug Fixes to AST Handling ^ diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 2d22692f3ab750..92a08bae03b485 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13714,6 +13714,12 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // We need ThisType when build capture in CheckCXXThisCapture. + Sema::CXXThisScopeRAII ThisScope( + getSema(), + dyn_cast_if_present( + getSema().getFunctionLevelDeclContext()), + Qualifiers()); getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), /*BuildAndDiagnose*/ true, nullptr, C->getCaptureKind() == LCK_StarThis); diff --git a/clang/test/Sema/PR85343.cpp b/clang/test/Sema/PR85343.cpp new file mode 100644 index 00..d90ef19d423455 --- /dev/null +++ b/clang/test/Sema/PR85343.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++14 -verify %s +// expected-no-diagnostics + +template auto ab() -> c ; + +template struct e {}; + +template struct ac { + template static e()(ab))> i; + decltype(i) j; +}; + +struct d { + template + d(f) { +ac a; + } +}; +struct a { + d b = [=](auto) { (void)[this] {}; }; +}; +void b() { new a; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
@@ -13714,6 +13714,12 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // We need ThisType here. + Sema::CXXThisScopeRAII ThisScope( + getSema(), + dyn_cast_or_null( Sirraide wrote: ```suggestion dyn_cast_if_present( ``` `cast_or_null` and friends are deprecated. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
@@ -394,6 +394,7 @@ Bug Fixes to C++ Support expression references to an entity declared outside of the lambda. (#GH64808) - Clang's __builtin_bit_cast will now produce a constant value for records with empty bases. See: (#GH82383) +- Fix a crash in lambda instantiation that missing set ``ThisType`` when checking capture. Fixes (#GH85343). Sirraide wrote: This sentence is really hard to parse; maybe something like this makes it a bit clearer what the actual change here is; if you can think of a better way of wording it, feel free to go w/ that instead. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
@@ -13714,6 +13714,12 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // We need ThisType here. Sirraide wrote: This comment doesn’t really explain anything. I’d suggest explaining *why*, not *that*, we need a `ThisScope` here. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
@@ -394,6 +394,7 @@ Bug Fixes to C++ Support expression references to an entity declared outside of the lambda. (#GH64808) - Clang's __builtin_bit_cast will now produce a constant value for records with empty bases. See: (#GH82383) +- Fix a crash in lambda instantiation that missing set ``ThisType`` when checking capture. Fixes (#GH85343). Sirraide wrote: ```suggestion - Fix a crash when instantiating a lambda that captures ``this`` outside of its context. Fixes (#GH85343). ``` https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/Sirraide requested changes to this pull request. Looks fine to me apart from a few minor things. https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/Sirraide edited https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky edited https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/85565 >From 535617d786799c7657155e6e2cfa34fd3070f840 Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 17 Mar 2024 17:48:05 +0800 Subject: [PATCH] [Clang][Sema] Fix a crash in lambda instantiation --- clang/docs/ReleaseNotes.rst| 1 + clang/lib/Sema/TreeTransform.h | 6 ++ clang/test/Sema/PR85343.cpp| 22 ++ 3 files changed, 29 insertions(+) create mode 100644 clang/test/Sema/PR85343.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 125d51c42d507f..2587c9d002c2c9 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -394,6 +394,7 @@ Bug Fixes to C++ Support expression references to an entity declared outside of the lambda. (#GH64808) - Clang's __builtin_bit_cast will now produce a constant value for records with empty bases. See: (#GH82383) +- Fix a crash in lambda instantiation that missing set ``ThisType`` when checking capture. Fixes (#GH85343). Bug Fixes to AST Handling ^ diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 2d22692f3ab750..9d638d27d5f51c 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13714,6 +13714,12 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { // Capturing 'this' is trivial. if (C->capturesThis()) { + // We need ThisType here. + Sema::CXXThisScopeRAII ThisScope( + getSema(), + dyn_cast_or_null( + getSema().getFunctionLevelDeclContext()), + Qualifiers()); getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), /*BuildAndDiagnose*/ true, nullptr, C->getCaptureKind() == LCK_StarThis); diff --git a/clang/test/Sema/PR85343.cpp b/clang/test/Sema/PR85343.cpp new file mode 100644 index 00..d90ef19d423455 --- /dev/null +++ b/clang/test/Sema/PR85343.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++14 -verify %s +// expected-no-diagnostics + +template auto ab() -> c ; + +template struct e {}; + +template struct ac { + template static e()(ab))> i; + decltype(i) j; +}; + +struct d { + template + d(f) { +ac a; + } +}; +struct a { + d b = [=](auto) { (void)[this] {}; }; +}; +void b() { new a; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/85565 >From 6aebe68afc9930b080d5a5690799a3689de2d055 Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 17 Mar 2024 17:48:05 +0800 Subject: [PATCH] [Clang][Sema] Fix a crash in lambda instantiation --- clang/docs/ReleaseNotes.rst| 1 + clang/lib/Sema/TreeTransform.h | 4 clang/test/Sema/PR85343.cpp| 22 ++ 3 files changed, 27 insertions(+) create mode 100644 clang/test/Sema/PR85343.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ba9de1ac98de08..26a87e9ab7b066 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -392,6 +392,7 @@ Bug Fixes to C++ Support Fixes (#GH84368). - Fixed a crash while checking constraints of a trailing requires-expression of a lambda, that the expression references to an entity declared outside of the lambda. (#GH64808) +- Fix a crash in lambda instantiation that missing set ``ThisType`` when checking capture. Fixes (#GH85343). Bug Fixes to AST Handling ^ diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 2d22692f3ab750..69d8e38181897d 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13698,6 +13698,10 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { E->hasExplicitParameters(), E->isMutable()); // Introduce the context of the call operator. + // We need ThisType in lambda instantiation. + std::optional ThisScope; + if (auto *RD = dyn_cast(SemaRef.getFunctionLevelDeclContext())) +ThisScope.emplace(SemaRef, RD, Qualifiers()); Sema::ContextRAII SavedContext(getSema(), NewCallOperator, /*NewThisContext*/false); diff --git a/clang/test/Sema/PR85343.cpp b/clang/test/Sema/PR85343.cpp new file mode 100644 index 00..d90ef19d423455 --- /dev/null +++ b/clang/test/Sema/PR85343.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++14 -verify %s +// expected-no-diagnostics + +template auto ab() -> c ; + +template struct e {}; + +template struct ac { + template static e()(ab))> i; + decltype(i) j; +}; + +struct d { + template + d(f) { +ac a; + } +}; +struct a { + d b = [=](auto) { (void)[this] {}; }; +}; +void b() { new a; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/85565 >From edaea6b244e9e35998421e551fb757e6ba099668 Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 17 Mar 2024 17:48:05 +0800 Subject: [PATCH] [Clang][Sema] Fix a crash in lambda instantiation --- clang/docs/ReleaseNotes.rst | 1 + .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 4 clang/lib/Sema/TreeTransform.h| 4 clang/test/Sema/PR85343.cpp | 22 +++ 4 files changed, 31 insertions(+) create mode 100644 clang/test/Sema/PR85343.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ba9de1ac98de08..26a87e9ab7b066 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -392,6 +392,7 @@ Bug Fixes to C++ Support Fixes (#GH84368). - Fixed a crash while checking constraints of a trailing requires-expression of a lambda, that the expression references to an entity declared outside of the lambda. (#GH64808) +- Fix a crash in lambda instantiation that missing set ``ThisType`` when checking capture. Fixes (#GH85343). Bug Fixes to AST Handling ^ diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index dc972018e7b281..7786557396cd13 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -5182,6 +5182,10 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // Enter the scope of this instantiation. We don't use // PushDeclContext because we don't have a scope. Sema::ContextRAII savedContext(*this, Function); +// We need ThisType in lambda instantiation. +Sema::CXXThisScopeRAII ThisScope( +*this, dyn_cast(Function->getDeclContext()), +Qualifiers()); FPFeaturesStateRAII SavedFPFeatures(*this); CurFPFeatures = FPOptions(getLangOpts()); diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 2d22692f3ab750..69d8e38181897d 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13698,6 +13698,10 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { E->hasExplicitParameters(), E->isMutable()); // Introduce the context of the call operator. + // We need ThisType in lambda instantiation. + std::optional ThisScope; + if (auto *RD = dyn_cast(SemaRef.getFunctionLevelDeclContext())) +ThisScope.emplace(SemaRef, RD, Qualifiers()); Sema::ContextRAII SavedContext(getSema(), NewCallOperator, /*NewThisContext*/false); diff --git a/clang/test/Sema/PR85343.cpp b/clang/test/Sema/PR85343.cpp new file mode 100644 index 00..d90ef19d423455 --- /dev/null +++ b/clang/test/Sema/PR85343.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++14 -verify %s +// expected-no-diagnostics + +template auto ab() -> c ; + +template struct e {}; + +template struct ac { + template static e()(ab))> i; + decltype(i) j; +}; + +struct d { + template + d(f) { +ac a; + } +}; +struct a { + d b = [=](auto) { (void)[this] {}; }; +}; +void b() { new a; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/85565 >From f6338c5674ad7ca9ad7595a6fbce2526fcc3f055 Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 17 Mar 2024 17:48:05 +0800 Subject: [PATCH] [Clang][Sema] Fix a crash in lambda instantiation --- clang/docs/ReleaseNotes.rst | 1 + .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 4 clang/test/Sema/PR85343.cpp | 22 +++ 3 files changed, 27 insertions(+) create mode 100644 clang/test/Sema/PR85343.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ba9de1ac98de08..26a87e9ab7b066 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -392,6 +392,7 @@ Bug Fixes to C++ Support Fixes (#GH84368). - Fixed a crash while checking constraints of a trailing requires-expression of a lambda, that the expression references to an entity declared outside of the lambda. (#GH64808) +- Fix a crash in lambda instantiation that missing set ``ThisType`` when checking capture. Fixes (#GH85343). Bug Fixes to AST Handling ^ diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index dc972018e7b281..7786557396cd13 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -5182,6 +5182,10 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // Enter the scope of this instantiation. We don't use // PushDeclContext because we don't have a scope. Sema::ContextRAII savedContext(*this, Function); +// We need ThisType in lambda instantiation. +Sema::CXXThisScopeRAII ThisScope( +*this, dyn_cast(Function->getDeclContext()), +Qualifiers()); FPFeaturesStateRAII SavedFPFeatures(*this); CurFPFeatures = FPOptions(getLangOpts()); diff --git a/clang/test/Sema/PR85343.cpp b/clang/test/Sema/PR85343.cpp new file mode 100644 index 00..20e618482e4d86 --- /dev/null +++ b/clang/test/Sema/PR85343.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++11 -verify %s +// expected-no-diagnostics + +template auto ab() -> c ; + +template struct e {}; + +template struct ac { + template static e()(ab))> i; + decltype(i) j; +}; + +struct d { + template + d(f) { +ac a; + } +}; +struct a { + d b = [=](auto) { (void)[this] {}; }; +}; +void b() { new a; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
llvmbot wrote: @llvm/pr-subscribers-clang Author: Qizhi Hu (jcsxky) Changes Fix https://github.com/llvm/llvm-project/issues/85343 When build lambda expression in lambda instantiation, `ThisType` is required in `Sema::BuildCaptureInit`. Set it in `Sema::InstantiateFunctionDefinition` when build capture of lambda and it will be used later in lambda expression transformation. --- Full diff: https://github.com/llvm/llvm-project/pull/85565.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+1) - (modified) clang/lib/Sema/SemaTemplateInstantiateDecl.cpp (+7) - (added) clang/test/Sema/PR85343.cpp (+22) ``diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ba9de1ac98de08..26a87e9ab7b066 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -392,6 +392,7 @@ Bug Fixes to C++ Support Fixes (#GH84368). - Fixed a crash while checking constraints of a trailing requires-expression of a lambda, that the expression references to an entity declared outside of the lambda. (#GH64808) +- Fix a crash in lambda instantiation that missing set ``ThisType`` when checking capture. Fixes (#GH85343). Bug Fixes to AST Handling ^ diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index dc972018e7b281..dcfb1798d69641 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -13,12 +13,14 @@ #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTMutationListener.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/DeclVisitor.h" #include "clang/AST/DependentDiagnostic.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/PrettyDeclStackTrace.h" +#include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TargetInfo.h" @@ -29,6 +31,7 @@ #include "clang/Sema/SemaInternal.h" #include "clang/Sema/Template.h" #include "clang/Sema/TemplateInstCallback.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/TimeProfiler.h" #include @@ -5182,6 +5185,10 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // Enter the scope of this instantiation. We don't use // PushDeclContext because we don't have a scope. Sema::ContextRAII savedContext(*this, Function); +// We need ThisType in lambda instantiation. +Sema::CXXThisScopeRAII ThisScope( +*this, dyn_cast(Function->getDeclContext()), +Qualifiers()); FPFeaturesStateRAII SavedFPFeatures(*this); CurFPFeatures = FPOptions(getLangOpts()); diff --git a/clang/test/Sema/PR85343.cpp b/clang/test/Sema/PR85343.cpp new file mode 100644 index 00..aa598a5df400bd --- /dev/null +++ b/clang/test/Sema/PR85343.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++11 -verify %s +// expected-no-diagnostics + +template auto ab() -> c ; + +template struct e {}; + +template struct ac { + template static e()(ab))> i; + decltype(i) j; +}; + +struct d { + template + d(f) { +ac a; + } +}; +struct a { + d b = [=](auto) { (void)[this] {}; }; +}; +void b() { new a; } \ No newline at end of file `` https://github.com/llvm/llvm-project/pull/85565 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][Sema] Fix a crash in lambda instantiation (PR #85565)
https://github.com/jcsxky created https://github.com/llvm/llvm-project/pull/85565 Fix https://github.com/llvm/llvm-project/issues/85343 When build lambda expression in lambda instantiation, `ThisType` is required in `Sema::BuildCaptureInit`. Set it in `Sema::InstantiateFunctionDefinition` when build capture of lambda and it will be used later in lambda expression transformation. >From f99ffc9984438140e902f083cfd4ade05b2cbd7f Mon Sep 17 00:00:00 2001 From: huqizhi Date: Sun, 17 Mar 2024 17:48:05 +0800 Subject: [PATCH] [Clang][Sema] Fix a crash in lambda instantiation --- clang/docs/ReleaseNotes.rst | 1 + .../lib/Sema/SemaTemplateInstantiateDecl.cpp | 7 ++ clang/test/Sema/PR85343.cpp | 22 +++ 3 files changed, 30 insertions(+) create mode 100644 clang/test/Sema/PR85343.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ba9de1ac98de08..26a87e9ab7b066 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -392,6 +392,7 @@ Bug Fixes to C++ Support Fixes (#GH84368). - Fixed a crash while checking constraints of a trailing requires-expression of a lambda, that the expression references to an entity declared outside of the lambda. (#GH64808) +- Fix a crash in lambda instantiation that missing set ``ThisType`` when checking capture. Fixes (#GH85343). Bug Fixes to AST Handling ^ diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index dc972018e7b281..dcfb1798d69641 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -13,12 +13,14 @@ #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTMutationListener.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/DeclVisitor.h" #include "clang/AST/DependentDiagnostic.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/PrettyDeclStackTrace.h" +#include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TargetInfo.h" @@ -29,6 +31,7 @@ #include "clang/Sema/SemaInternal.h" #include "clang/Sema/Template.h" #include "clang/Sema/TemplateInstCallback.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/TimeProfiler.h" #include @@ -5182,6 +5185,10 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, // Enter the scope of this instantiation. We don't use // PushDeclContext because we don't have a scope. Sema::ContextRAII savedContext(*this, Function); +// We need ThisType in lambda instantiation. +Sema::CXXThisScopeRAII ThisScope( +*this, dyn_cast(Function->getDeclContext()), +Qualifiers()); FPFeaturesStateRAII SavedFPFeatures(*this); CurFPFeatures = FPOptions(getLangOpts()); diff --git a/clang/test/Sema/PR85343.cpp b/clang/test/Sema/PR85343.cpp new file mode 100644 index 00..aa598a5df400bd --- /dev/null +++ b/clang/test/Sema/PR85343.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -std=c++11 -verify %s +// expected-no-diagnostics + +template auto ab() -> c ; + +template struct e {}; + +template struct ac { + template static e()(ab))> i; + decltype(i) j; +}; + +struct d { + template + d(f) { +ac a; + } +}; +struct a { + d b = [=](auto) { (void)[this] {}; }; +}; +void b() { new a; } \ No newline at end of file ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits