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); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits