Author: Timm Baeder Date: 2024-09-11T16:14:41+02:00 New Revision: 35f7cfb22420a7c94b48e54fa28195ada9863d1a
URL: https://github.com/llvm/llvm-project/commit/35f7cfb22420a7c94b48e54fa28195ada9863d1a DIFF: https://github.com/llvm/llvm-project/commit/35f7cfb22420a7c94b48e54fa28195ada9863d1a.diff LOG: [clang][bytecode] Check for Pointer dereference in EvaluationResult (#108207) We will deref<>() it later, so this is the right check. Added: Modified: clang/lib/AST/ByteCode/EvaluationResult.cpp clang/test/AST/ByteCode/initializer_list.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/EvaluationResult.cpp b/clang/lib/AST/ByteCode/EvaluationResult.cpp index bdebd19af9f940..627d4b2f65be9d 100644 --- a/clang/lib/AST/ByteCode/EvaluationResult.cpp +++ b/clang/lib/AST/ByteCode/EvaluationResult.cpp @@ -178,8 +178,8 @@ bool EvaluationResult::checkFullyInitialized(InterpState &S, static void collectBlocks(const Pointer &Ptr, llvm::SetVector<const Block *> &Blocks) { auto isUsefulPtr = [](const Pointer &P) -> bool { - return P.isLive() && !P.isZero() && !P.isDummy() && - !P.isUnknownSizeArray() && !P.isOnePastEnd() && P.isBlockPointer(); + return P.isLive() && !P.isZero() && !P.isDummy() && P.isDereferencable() && + !P.isUnknownSizeArray() && !P.isOnePastEnd(); }; if (!isUsefulPtr(Ptr)) diff --git a/clang/test/AST/ByteCode/initializer_list.cpp b/clang/test/AST/ByteCode/initializer_list.cpp index 4e3b8dc9120167..f882e4ff1b1247 100644 --- a/clang/test/AST/ByteCode/initializer_list.cpp +++ b/clang/test/AST/ByteCode/initializer_list.cpp @@ -1,8 +1,6 @@ // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++20 -verify=expected,both %s // RUN: %clang_cc1 -std=c++20 -fms-extensions -verify=ref,both %s -// both-no-diagnostics - namespace std { typedef decltype(sizeof(int)) size_t; template <class _E> @@ -53,3 +51,21 @@ constexpr int foo() { } static_assert(foo() == 0); + + +namespace rdar13395022 { + struct MoveOnly { // both-note {{candidate}} + MoveOnly(MoveOnly&&); // both-note 2{{copy constructor is implicitly deleted because}} both-note {{candidate}} + }; + + void test(MoveOnly mo) { + auto &&list1 = {mo}; // both-error {{call to implicitly-deleted copy constructor}} both-note {{in initialization of temporary of type 'std::initializer_list}} + MoveOnly (&&list2)[1] = {mo}; // both-error {{call to implicitly-deleted copy constructor}} both-note {{in initialization of temporary of type 'MoveOnly[1]'}} + std::initializer_list<MoveOnly> &&list3 = {}; + MoveOnly (&&list4)[1] = {}; // both-error {{no matching constructor}} + // both-note@-1 {{in implicit initialization of array element 0 with omitted initializer}} + // both-note@-2 {{in initialization of temporary of type 'MoveOnly[1]' created to list-initialize this reference}} + } +} + + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits