From b15617522dbe2689291843c5fe0971a6a9fa70d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Thu, 16 Oct 2025 16:13:50 +0200 Subject: [PATCH] [clang][bytecode] Reject typeid pointers from OffsetHelper --- clang/lib/AST/ByteCode/Interp.h | 2 ++ clang/test/AST/ByteCode/typeid.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index 812d25fc79490..2f7e2d98f3576 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -2258,6 +2258,8 @@ std::optional OffsetHelper(InterpState &S, CodePtr OpPC, S.CCEDiag(S.Current->getSource(OpPC), diag::note_constexpr_array_index) << N << /*non-array*/ true << 0; return Pointer(Ptr.asFunctionPointer().getFunction(), N); + } else if (!Ptr.isBlockPointer()) { + return std::nullopt; } assert(Ptr.isBlockPointer()); diff --git a/clang/test/AST/ByteCode/typeid.cpp b/clang/test/AST/ByteCode/typeid.cpp index 090309d16e737..aca18d4e25277 100644 --- a/clang/test/AST/ByteCode/typeid.cpp +++ b/clang/test/AST/ByteCode/typeid.cpp @@ -63,9 +63,12 @@ namespace TypeidPtrInEvaluationResult { // Regression test for crash in ArrayElemPtrPop with typeid pointers. GH-163127 namespace TypeidPtrRegression { void dontcrash() { - // this should just be an error and not an ICE constexpr auto res = ((void**)&typeid(int))[0]; // both-error {{must be initialized by a constant expression}} \ - // both-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}} + // both-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}} + } + void dontcrash2() { + constexpr auto res = ((void**)&typeid(int))[1]; // both-error {{must be initialized by a constant expression}} \ + // both-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}} } }