[clang] b1b9cd4 - [clang]set invalid for lambda which missing capture `this` (#70432)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 27 08:52:10 PDT 2023
Author: Congcong Cai
Date: 2023-10-27T23:52:05+08:00
New Revision: b1b9cd4e457dc3c5d7e59104d5502da23295e49c
URL: https://github.com/llvm/llvm-project/commit/b1b9cd4e457dc3c5d7e59104d5502da23295e49c
DIFF: https://github.com/llvm/llvm-project/commit/b1b9cd4e457dc3c5d7e59104d5502da23295e49c.diff
LOG: [clang]set invalid for lambda which missing capture `this` (#70432)
It can suppression further crash.
Fixes: #67687
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/lambda-expressions.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8eca67677f1d82c..2595737e8b3b143 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -529,6 +529,8 @@ Bug Fixes in This Version
``thread_local`` instead of ``_Thread_local``.
Fixes (`#70068 <https://github.com/llvm/llvm-project/issues/70068>`_) and
(`#69167 <https://github.com/llvm/llvm-project/issues/69167>`_)
+- Fix crash in evaluating invalid lambda expression which forget capture this.
+ Fixes (`#67687 <https://github.com/llvm/llvm-project/issues/67687>`_)
- Fix crash from constexpr evaluator evaluating uninitialized arrays as rvalue.
Fixes (`#67317 <https://github.com/llvm/llvm-project/issues/67317>`_)
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 1153049496d129f..6344c9102330a00 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -1333,6 +1333,7 @@ bool Sema::CheckCXXThisCapture(SourceLocation Loc, const bool Explicit,
if (LSI && isGenericLambdaCallOperatorSpecialization(LSI->CallOperator)) {
// This context can't implicitly capture 'this'; fail out.
if (BuildAndDiagnose) {
+ LSI->CallOperator->setInvalidDecl();
Diag(Loc, diag::err_this_capture)
<< (Explicit && idx == MaxFunctionScopesIndex);
if (!Explicit)
@@ -1354,10 +1355,11 @@ bool Sema::CheckCXXThisCapture(SourceLocation Loc, const bool Explicit,
continue;
}
// This context can't implicitly capture 'this'; fail out.
- if (BuildAndDiagnose)
+ if (BuildAndDiagnose) {
+ LSI->CallOperator->setInvalidDecl();
Diag(Loc, diag::err_this_capture)
<< (Explicit && idx == MaxFunctionScopesIndex);
-
+ }
if (!Explicit)
buildLambdaThisCaptureFixit(*this, LSI);
return true;
diff --git a/clang/test/SemaCXX/lambda-expressions.cpp b/clang/test/SemaCXX/lambda-expressions.cpp
index b4209d50ad03d71..1797eef320b8659 100644
--- a/clang/test/SemaCXX/lambda-expressions.cpp
+++ b/clang/test/SemaCXX/lambda-expressions.cpp
@@ -382,6 +382,14 @@ namespace PR18128 {
};
}
+namespace gh67687 {
+struct S {
+ int n;
+ int a = (4, []() { return n; }()); // expected-error {{'this' cannot be implicitly captured in this context}} \
+ // expected-note {{explicitly capture 'this'}}
+};
+}
+
namespace PR18473 {
template<typename T> void f() {
T t(0);
More information about the cfe-commits
mailing list