Author: Timm Bäder Date: 2024-05-11T20:20:04+02:00 New Revision: 379b77773cf653352f30f8c7cca393f4df9389be
URL: https://github.com/llvm/llvm-project/commit/379b77773cf653352f30f8c7cca393f4df9389be DIFF: https://github.com/llvm/llvm-project/commit/379b77773cf653352f30f8c7cca393f4df9389be.diff LOG: [clang][Interp] Use pointee metadata size in isRoot() Previously, isRoot() would return true for pointers with a base of sizeof(InlineDescriptor), even if the actual metadata size of the pointee was 0. Added: Modified: clang/lib/AST/Interp/Pointer.h clang/unittests/AST/Interp/Descriptor.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/Pointer.h b/clang/lib/AST/Interp/Pointer.h index c4d701bc71b7b..79fab05670e96 100644 --- a/clang/lib/AST/Interp/Pointer.h +++ b/clang/lib/AST/Interp/Pointer.h @@ -226,8 +226,7 @@ class Pointer { return *this; // If at base, point to an array of base types. - if (asBlockPointer().Base == 0 || - asBlockPointer().Base == sizeof(InlineDescriptor)) + if (isRoot()) return Pointer(asBlockPointer().Pointee, RootPtrMark, 0); // Step into the containing array, if inside one. @@ -306,10 +305,8 @@ class Pointer { const Descriptor *getFieldDesc() const { if (isIntegralPointer()) return asIntPointer().Desc; - if (isBlockPointer() && - (asBlockPointer().Base == 0 || - asBlockPointer().Base == sizeof(InlineDescriptor) || - asBlockPointer().Base == RootPtrMark)) + + if (isRoot()) return getDeclDesc(); return getInlineDesc()->Desc; } @@ -390,8 +387,7 @@ class Pointer { // If this points inside a dummy block, return true. // FIXME: This might change in the future. If it does, we need // to set the proper Ctor/Dtor functions for dummy Descriptors. - if (asBlockPointer().Base != 0 && - asBlockPointer().Base != sizeof(InlineDescriptor) && isDummy()) + if (!isRoot() && isDummy()) return true; return getFieldDesc()->isUnknownSizeArray(); } @@ -403,9 +399,11 @@ class Pointer { } /// Pointer points directly to a block. bool isRoot() const { - return (asBlockPointer().Base == 0 || - asBlockPointer().Base == RootPtrMark) && - Offset == 0; + if (isZero() || isIntegralPointer()) + return true; + return (asBlockPointer().Base == + asBlockPointer().Pointee->getDescriptor()->getMetadataSize() || + asBlockPointer().Base == 0); } /// If this pointer has an InlineDescriptor we can use to initialize. bool canBeInitialized() const { @@ -487,9 +485,7 @@ class Pointer { bool isActive() const { if (!isBlockPointer()) return true; - return asBlockPointer().Base == 0 || - asBlockPointer().Base == sizeof(InlineDescriptor) || - getInlineDesc()->IsActive; + return isRoot() || getInlineDesc()->IsActive; } /// Checks if a structure is a base class. bool isBaseClass() const { return isField() && getInlineDesc()->IsBase; } @@ -508,10 +504,7 @@ class Pointer { bool isConst() const { if (isIntegralPointer()) return true; - return (asBlockPointer().Base == 0 || - asBlockPointer().Base == sizeof(InlineDescriptor)) - ? getDeclDesc()->IsConst - : getInlineDesc()->IsConst; + return isRoot() ? getDeclDesc()->IsConst : getInlineDesc()->IsConst; } /// Returns the declaration ID. @@ -567,6 +560,9 @@ class Pointer { if (!asBlockPointer().Pointee) return false; + if (isDummy()) + return false; + return isElementPastEnd() || getSize() == getOffset(); } diff --git a/clang/unittests/AST/Interp/Descriptor.cpp b/clang/unittests/AST/Interp/Descriptor.cpp index 4ea0fbc285a98..053d579ea3919 100644 --- a/clang/unittests/AST/Interp/Descriptor.cpp +++ b/clang/unittests/AST/Interp/Descriptor.cpp @@ -115,7 +115,7 @@ TEST(Descriptor, Primitives) { // Check pointer stuff. // Global variables have an inline descriptor. - ASSERT_FALSE(GlobalPtr.isRoot()); + ASSERT_TRUE(GlobalPtr.isRoot()); ASSERT_TRUE(GlobalPtr.isLive()); ASSERT_FALSE(GlobalPtr.isZero()); ASSERT_FALSE(GlobalPtr.isField()); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits