[clang] 379b777 - [clang][Interp] Use pointee metadata size in isRoot()
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Sat May 11 11:20:28 PDT 2024
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());
More information about the cfe-commits
mailing list