diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 8eca67677f1d8..2595737e8b3b1 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 `_) and (`#69167 `_) +- Fix crash in evaluating invalid lambda expression which forget capture this. + Fixes (`#67687 `_) - Fix crash from constexpr evaluator evaluating uninitialized arrays as rvalue. Fixes (`#67317 `_) diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 1153049496d12..6344c9102330a 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 b4209d50ad03d..1797eef320b86 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 void f() { T t(0);