diff options
author | Timm Baeder <tbaeder@redhat.com> | 2025-05-20 11:19:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-20 11:19:24 +0200 |
commit | d01355645b1fece147163e1cfe9f71d9c704860e (patch) | |
tree | 3c05db512b3e925cf94abdb39e7090ca3b6d42ca /clang/lib/AST/ByteCode/Compiler.cpp | |
parent | 2fb6ff46f62e53e821b37d3ca0a71985969eaf44 (diff) | |
download | llvm-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.cpp | 9 |
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: { |