diff options
| author | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:56:36 +0900 |
|---|---|---|
| committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:56:36 +0900 |
| commit | b0cb9219fc3deea4a7bc7cfd8502627f40b50957 (patch) | |
| tree | 84c5f170501c53288f117cf3192fc7ae2a919321 /clang/lib/AST/ByteCode/Pointer.cpp | |
| parent | 7f16c19a2f3af731ca6c2c47c502d8e9806da2a9 (diff) | |
| parent | 73176fb8a6c44fc68898f014dd7336515c7fe5f2 (diff) | |
Merge branch 'users/chapuni/cov/single/binop-base' into users/chapuni/cov/single/binopusers/chapuni/cov/single/binop
Diffstat (limited to 'clang/lib/AST/ByteCode/Pointer.cpp')
| -rw-r--r-- | clang/lib/AST/ByteCode/Pointer.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp index 01e642310aad..ec4756fe4f87 100644 --- a/clang/lib/AST/ByteCode/Pointer.cpp +++ b/clang/lib/AST/ByteCode/Pointer.cpp @@ -96,6 +96,8 @@ void Pointer::operator=(const Pointer &P) { PointeeStorage.Int = P.PointeeStorage.Int; } else if (P.isFunctionPointer()) { PointeeStorage.Fn = P.PointeeStorage.Fn; + } else if (P.isTypeidPointer()) { + PointeeStorage.Typeid = P.PointeeStorage.Typeid; } else { assert(false && "Unhandled storage kind"); } @@ -132,6 +134,8 @@ void Pointer::operator=(Pointer &&P) { PointeeStorage.Int = P.PointeeStorage.Int; } else if (P.isFunctionPointer()) { PointeeStorage.Fn = P.PointeeStorage.Fn; + } else if (P.isTypeidPointer()) { + PointeeStorage.Typeid = P.PointeeStorage.Typeid; } else { assert(false && "Unhandled storage kind"); } @@ -151,6 +155,14 @@ APValue Pointer::toAPValue(const ASTContext &ASTCtx) const { if (isFunctionPointer()) return asFunctionPointer().toAPValue(ASTCtx); + if (isTypeidPointer()) { + TypeInfoLValue TypeInfo(PointeeStorage.Typeid.TypePtr); + return APValue( + APValue::LValueBase::getTypeInfo( + TypeInfo, QualType(PointeeStorage.Typeid.TypeInfoType, 0)), + CharUnits::Zero(), APValue::NoLValuePath{}); + } + // Build the lvalue base from the block. const Descriptor *Desc = getDeclDesc(); APValue::LValueBase Base; @@ -304,6 +316,9 @@ void Pointer::print(llvm::raw_ostream &OS) const { case Storage::Fn: OS << "(Fn) { " << asFunctionPointer().getFunction() << " + " << Offset << " }"; + break; + case Storage::Typeid: + OS << "(Typeid)"; } } @@ -450,6 +465,8 @@ bool Pointer::hasSameBase(const Pointer &A, const Pointer &B) { return true; if (A.isFunctionPointer() && B.isFunctionPointer()) return true; + if (A.isTypeidPointer() && B.isTypeidPointer()) + return true; if (A.isIntegralPointer() || B.isIntegralPointer()) return A.getSource() == B.getSource(); |
