Author: Timm Baeder Date: 2025-03-25T11:37:03+01:00 New Revision: a29b0d74a198a9c91d39b4d9224c242e1a22df18
URL: https://github.com/llvm/llvm-project/commit/a29b0d74a198a9c91d39b4d9224c242e1a22df18 DIFF: https://github.com/llvm/llvm-project/commit/a29b0d74a198a9c91d39b4d9224c242e1a22df18.diff LOG: [clang][bytecode] Fix base cast of nullptr without descriptor (#132909) The missing descriptor should only happen if the pointer is null pointer. Added: Modified: clang/lib/AST/ByteCode/Pointer.cpp clang/test/AST/ByteCode/records.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp index 8abdc54b64677..79b47c26992ae 100644 --- a/clang/lib/AST/ByteCode/Pointer.cpp +++ b/clang/lib/AST/ByteCode/Pointer.cpp @@ -720,6 +720,10 @@ IntPointer IntPointer::atOffset(const ASTContext &ASTCtx, IntPointer IntPointer::baseCast(const ASTContext &ASTCtx, unsigned BaseOffset) const { + if (!Desc) { + assert(Value == 0); + return *this; + } const Record *R = Desc->ElemRecord; const Descriptor *BaseDesc = nullptr; diff --git a/clang/test/AST/ByteCode/records.cpp b/clang/test/AST/ByteCode/records.cpp index 5d9f1044f206b..da851785323a5 100644 --- a/clang/test/AST/ByteCode/records.cpp +++ b/clang/test/AST/ByteCode/records.cpp @@ -1771,3 +1771,19 @@ namespace RedeclaredCtor { constexpr __sp_mut::__sp_mut(void *p) noexcept : __lx_(p) {} constexpr __sp_mut muts = &mut_back[0]; } + +namespace IntegralBaseCast { + class A {}; + class B : public A {}; + struct S { + B *a; + }; + + constexpr int f() { + S s{}; + A *a = s.a; + return 0; + } + + static_assert(f() == 0, ""); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits