Author: Timm Baeder Date: 2025-03-03T16:26:56+01:00 New Revision: 96336acb48562edcae59eb1d5d4acb0200efeded
URL: https://github.com/llvm/llvm-project/commit/96336acb48562edcae59eb1d5d4acb0200efeded DIFF: https://github.com/llvm/llvm-project/commit/96336acb48562edcae59eb1d5d4acb0200efeded.diff LOG: [clang][bytecode] Tighten double-destroy check (#129528) The instance pointer of the current function being the same as the one we're destroying is only relevant if said function is also a destructor. Added: Modified: clang/lib/AST/ByteCode/Interp.cpp clang/test/AST/ByteCode/new-delete.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index 5e0d2e91fb1b2..67b7ac1f8f0f9 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -992,7 +992,8 @@ static bool runRecordDestructor(InterpState &S, CodePtr OpPC, const Record *R = Desc->ElemRecord; assert(R); - if (Pointer::pointToSameBlock(BasePtr, S.Current->getThis())) { + if (Pointer::pointToSameBlock(BasePtr, S.Current->getThis()) && + S.Current->getFunction()->isDestructor()) { const SourceInfo &Loc = S.Current->getSource(OpPC); S.FFDiag(Loc, diag::note_constexpr_double_destroy); return false; diff --git a/clang/test/AST/ByteCode/new-delete.cpp b/clang/test/AST/ByteCode/new-delete.cpp index a85ddaf29caf4..bd7351cbc3d4c 100644 --- a/clang/test/AST/ByteCode/new-delete.cpp +++ b/clang/test/AST/ByteCode/new-delete.cpp @@ -558,6 +558,11 @@ namespace DeleteThis { } static_assert(super_secret_double_delete()); // both-error {{not an integral constant expression}} \ // both-note {{in call to 'super_secret_double_delete()'}} + + struct B { + constexpr void reset() { delete this; } + }; + static_assert(((new B)->reset(), true)); } namespace CastedDelete { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits