https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/104901
Use delegate() there. To fix a follow-up problem, abort when a cast ends up on a valid Pointer that isn't a base class. >From cd2cc98cecc1f237da4a2aa30a9c07b07ae4c804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Tue, 20 Aug 2024 09:28:37 +0200 Subject: [PATCH] [clang][bytecode] Fix initializing base casts Use delegate() there. To fix a follow-up problem, abort when a cast ends up on a valid Pointer that isn't a base class. --- clang/lib/AST/ByteCode/Compiler.cpp | 8 ++++---- clang/lib/AST/ByteCode/Interp.h | 4 ++-- clang/test/Modules/merge-using-decls.cpp | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 53144a50ccf4a9..d84da1efb97695 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -214,7 +214,7 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) { unsigned DerivedOffset = collectBaseOffset(QualType(ToMP->getClass(), 0), QualType(FromMP->getClass(), 0)); - if (!this->visit(SubExpr)) + if (!this->delegate(SubExpr)) return false; return this->emitGetMemberPtrBasePop(DerivedOffset, CE); @@ -229,14 +229,14 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) { unsigned DerivedOffset = collectBaseOffset(QualType(FromMP->getClass(), 0), QualType(ToMP->getClass(), 0)); - if (!this->visit(SubExpr)) + if (!this->delegate(SubExpr)) return false; return this->emitGetMemberPtrBasePop(-DerivedOffset, CE); } case CK_UncheckedDerivedToBase: case CK_DerivedToBase: { - if (!this->visit(SubExpr)) + if (!this->delegate(SubExpr)) return false; const auto extractRecordDecl = [](QualType Ty) -> const CXXRecordDecl * { @@ -265,7 +265,7 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) { } case CK_BaseToDerived: { - if (!this->visit(SubExpr)) + if (!this->delegate(SubExpr)) return false; unsigned DerivedOffset = diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index 5aa3d24ebc7582..3c1fa0f93273d4 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -1568,7 +1568,7 @@ inline bool GetPtrBase(InterpState &S, CodePtr OpPC, uint32_t Off) { if (!CheckSubobject(S, OpPC, Ptr, CSK_Base)) return false; const Pointer &Result = Ptr.atField(Off); - if (Result.isPastEnd()) + if (Result.isPastEnd() || !Result.isBaseClass()) return false; S.Stk.push<Pointer>(Result); return true; @@ -1581,7 +1581,7 @@ inline bool GetPtrBasePop(InterpState &S, CodePtr OpPC, uint32_t Off) { if (!CheckSubobject(S, OpPC, Ptr, CSK_Base)) return false; const Pointer &Result = Ptr.atField(Off); - if (Result.isPastEnd()) + if (Result.isPastEnd() || !Result.isBaseClass()) return false; S.Stk.push<Pointer>(Result); return true; diff --git a/clang/test/Modules/merge-using-decls.cpp b/clang/test/Modules/merge-using-decls.cpp index e9794a40837ef9..b678eb4e0f851f 100644 --- a/clang/test/Modules/merge-using-decls.cpp +++ b/clang/test/Modules/merge-using-decls.cpp @@ -8,6 +8,7 @@ // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -x c++ -I%S/Inputs/merge-using-decls -verify -std=c++11 %s -DORDER=2 // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -x c++ -I%S/Inputs/merge-using-decls -verify -std=c++17 %s -DORDER=2 +// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fmodules -fimplicit-module-maps -fexperimental-new-constant-interpreter -fmodules-cache-path=%t -x c++ -I%S/Inputs/merge-using-decls -verify -std=c++98 %s -DORDER=1 #if ORDER == 1 #include "a.h" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits