Author: Timm Bäder Date: 2024-06-07T13:29:23+02:00 New Revision: b8cc85b318c0dd89e4dd69e3691ffcad5e401885
URL: https://github.com/llvm/llvm-project/commit/b8cc85b318c0dd89e4dd69e3691ffcad5e401885 DIFF: https://github.com/llvm/llvm-project/commit/b8cc85b318c0dd89e4dd69e3691ffcad5e401885.diff LOG: [clang][Interp] Limit lambda capture lazy visting to actual captures Check this by looking at the VarDecl. Added: Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/test/AST/Interp/lambda.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 8dc71b2527f3b..ff2b51e3fb6fa 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -3895,12 +3895,13 @@ bool ByteCodeExprGen<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) { return this->emitGetThisFieldPtr(Offset, E); return this->emitGetPtrThisField(Offset, E); } else if (const auto *DRE = dyn_cast<DeclRefExpr>(E); - DRE && DRE->refersToEnclosingVariableOrCapture() && - isa<VarDecl>(D)) { - if (!this->visitVarDecl(cast<VarDecl>(D))) - return false; - // Retry. - return this->visitDeclRef(D, E); + DRE && DRE->refersToEnclosingVariableOrCapture()) { + if (const auto *VD = dyn_cast<VarDecl>(D); VD && VD->isInitCapture()) { + if (!this->visitVarDecl(cast<VarDecl>(D))) + return false; + // Retry. + return this->visitDeclRef(D, E); + } } // Try to lazily visit (or emit dummy pointers for) declarations diff --git a/clang/test/AST/Interp/lambda.cpp b/clang/test/AST/Interp/lambda.cpp index 71e7077550b28..0eb12643b1b7f 100644 --- a/clang/test/AST/Interp/lambda.cpp +++ b/clang/test/AST/Interp/lambda.cpp @@ -267,3 +267,16 @@ namespace CaptureDefaults { constexpr auto t4 = ([x=42]() consteval { return x; }()); static_assert(t4 == 42, ""); + +namespace InvalidCapture { + + int &f(int *p); + char &f(...); + void g() { + int n = -1; // both-note {{declared here}} + [=] { + int arr[n]; // both-warning {{variable length arrays in C++ are a Clang extension}} \ + both-note {{read of non-const variable 'n' is not allowed in a constant expression}} + } (); + } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits