Author: cor3ntin Date: 2023-10-05T10:17:50+02:00 New Revision: 49666ec0386174b9fcf637560951b8ee29ca82c7
URL: https://github.com/llvm/llvm-project/commit/49666ec0386174b9fcf637560951b8ee29ca82c7 DIFF: https://github.com/llvm/llvm-project/commit/49666ec0386174b9fcf637560951b8ee29ca82c7.diff LOG: [Clang] Fix constant evaluating a captured variable in a lambda (#68090) with an explicit parameter. We tried to read a pointer to a non-existent `This` APValue when constant-evaluating an explicit object lambda call operator (the `this` pointer is never set in explicit object member functions) Fixes #68070 Added: Modified: clang/lib/AST/ExprConstant.cpp clang/test/SemaCXX/cxx2b-deducing-this-constexpr.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index d0e27de743604da..5a33e918db8e8c0 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -8370,7 +8370,13 @@ bool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) { if (auto *FD = Info.CurrentCall->LambdaCaptureFields.lookup(VD)) { // Start with 'Result' referring to the complete closure object... - Result = *Info.CurrentCall->This; + if (auto *MD = cast<CXXMethodDecl>(Info.CurrentCall->Callee); + MD->isExplicitObjectMemberFunction()) { + APValue *RefValue = + Info.getParamSlot(Info.CurrentCall->Arguments, MD->getParamDecl(0)); + Result.setFrom(Info.Ctx, *RefValue); + } else + Result = *Info.CurrentCall->This; // ... then update it to refer to the field of the closure object // that represents the capture. if (!HandleLValueMember(Info, E, Result, FD)) diff --git a/clang/test/SemaCXX/cxx2b-deducing-this-constexpr.cpp b/clang/test/SemaCXX/cxx2b-deducing-this-constexpr.cpp index 44de0d711674ba8..9dbea17dd2cae34 100644 --- a/clang/test/SemaCXX/cxx2b-deducing-this-constexpr.cpp +++ b/clang/test/SemaCXX/cxx2b-deducing-this-constexpr.cpp @@ -54,3 +54,21 @@ consteval void test() { static_assert(*s == 42); static_assert((s << 11) == 31); } + +namespace GH68070 { + +constexpr auto f = [x = 3]<typename Self>(this Self&& self) { + return x; +}; + +auto g = [x = 3]<typename Self>(this Self&& self) { + return x; +}; + +int test() { + constexpr int a = f(); + static_assert(a == 3); + return f() + g(); +} + +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits