[clang] a29b0d7 - [clang][bytecode] Fix base cast of nullptr without descriptor (#132909)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 25 03:37:06 PDT 2025
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, "");
+}
More information about the cfe-commits
mailing list