https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/154692
That code is from a time when typeid pointers didn't exist. We can get there for non-block, non-integral pointers, but we can't meaningfully handle that case. Just return false. Fixes #153712 >From 03f27769df4dd59037c320132b7744dbfb78ca79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Thu, 21 Aug 2025 10:03:05 +0200 Subject: [PATCH] [clang][bytecode] Fix a crash with typeid pointers That code is from a time when typeid pointers didn't exist. We can get there for non-block, non-integral pointers, but we can't meaningfully handle that case. Just return false. Fixes #153712 --- clang/lib/AST/ByteCode/Interp.h | 4 ++++ clang/test/AST/ByteCode/typeid.cpp | 14 +++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h index 149ce3b1042db..ee756492f6694 100644 --- a/clang/lib/AST/ByteCode/Interp.h +++ b/clang/lib/AST/ByteCode/Interp.h @@ -1788,6 +1788,8 @@ inline bool GetPtrBase(InterpState &S, CodePtr OpPC, uint32_t Off) { return false; if (!Ptr.isBlockPointer()) { + if (!Ptr.isIntegralPointer()) + return false; S.Stk.push<Pointer>(Ptr.asIntPointer().baseCast(S.getASTContext(), Off)); return true; } @@ -1809,6 +1811,8 @@ inline bool GetPtrBasePop(InterpState &S, CodePtr OpPC, uint32_t Off, return false; if (!Ptr.isBlockPointer()) { + if (!Ptr.isIntegralPointer()) + return false; S.Stk.push<Pointer>(Ptr.asIntPointer().baseCast(S.getASTContext(), Off)); return true; } diff --git a/clang/test/AST/ByteCode/typeid.cpp b/clang/test/AST/ByteCode/typeid.cpp index 5be5604016db5..179a66fd7fd0a 100644 --- a/clang/test/AST/ByteCode/typeid.cpp +++ b/clang/test/AST/ByteCode/typeid.cpp @@ -13,7 +13,12 @@ struct __type_info_implementations { typedef __unique_impl __impl; }; -class type_info { +class __pointer_type_info { +public: + int __flags = 0; +}; + +class type_info : public __pointer_type_info { protected: typedef __type_info_implementations::__impl __impl; __impl::__type_name_t __type_name; @@ -40,3 +45,10 @@ constexpr bool test() { return true; } static_assert(test()); + +int dontcrash() { + auto& pti = static_cast<const std::__pointer_type_info&>( + typeid(int) + ); + return pti.__flags == 0 ? 1 : 0; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits