aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/ByteCode/Compiler.cpp
diff options
context:
space:
mode:
authorTimm Baeder <tbaeder@redhat.com>2025-05-20 11:19:24 +0200
committerGitHub <noreply@github.com>2025-05-20 11:19:24 +0200
commitd01355645b1fece147163e1cfe9f71d9c704860e (patch)
tree3c05db512b3e925cf94abdb39e7090ca3b6d42ca /clang/lib/AST/ByteCode/Compiler.cpp
parent2fb6ff46f62e53e821b37d3ca0a71985969eaf44 (diff)
downloadllvm-d01355645b1fece147163e1cfe9f71d9c704860e.zip
llvm-d01355645b1fece147163e1cfe9f71d9c704860e.tar.gz
llvm-d01355645b1fece147163e1cfe9f71d9c704860e.tar.bz2
[clang][bytecode] Check downcasts for the correct type (#140689)
In multiple inheritance/diamond scenarios, we might arrive at the wrong type.
Diffstat (limited to 'clang/lib/AST/ByteCode/Compiler.cpp')
-rw-r--r--clang/lib/AST/ByteCode/Compiler.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 3638054..54a4647 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -296,12 +296,15 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
case CK_BaseToDerived: {
if (!this->delegate(SubExpr))
return false;
-
unsigned DerivedOffset =
collectBaseOffset(SubExpr->getType(), CE->getType());
- return this->emitGetPtrDerivedPop(
- DerivedOffset, /*NullOK=*/CE->getType()->isPointerType(), CE);
+ const Type *TargetType = CE->getType().getTypePtr();
+ if (TargetType->isPointerOrReferenceType())
+ TargetType = TargetType->getPointeeType().getTypePtr();
+ return this->emitGetPtrDerivedPop(DerivedOffset,
+ /*NullOK=*/CE->getType()->isPointerType(),
+ TargetType, CE);
}
case CK_FloatingCast: {