[clang] [clang][ExprConst] Check record base classes for valid structs (PR #132270)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 20 11:29:53 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Timm Baeder (tbaederr)
<details>
<summary>Changes</summary>
In error cases, the base might be None.
Fixes https://github.com/llvm/llvm-project/issues/132257
---
Full diff: https://github.com/llvm/llvm-project/pull/132270.diff
2 Files Affected:
- (modified) clang/lib/AST/ExprConstant.cpp (+6-1)
- (modified) clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp (+14)
``````````diff
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 92a28897cf3ee..8b40cdfbd2f1f 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -7385,8 +7385,13 @@ class APValueToBufferConverter {
for (size_t I = 0, E = CXXRD->getNumBases(); I != E; ++I) {
const CXXBaseSpecifier &BS = CXXRD->bases_begin()[I];
CXXRecordDecl *BaseDecl = BS.getType()->getAsCXXRecordDecl();
+ const APValue &Base = Val.getStructBase(I);
- if (!visitRecord(Val.getStructBase(I), BS.getType(),
+ // Can happen in error cases.
+ if (!Base.isStruct())
+ return false;
+
+ if (!visitRecord(Base, BS.getType(),
Layout.getBaseClassOffset(BaseDecl) + Offset))
return false;
}
diff --git a/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp b/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
index 425447c5e604e..7a6d7cb353158 100644
--- a/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
+++ b/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
@@ -527,3 +527,17 @@ namespace test_complex {
constexpr double D = __builtin_bit_cast(double, test_float_complex);
constexpr int M = __builtin_bit_cast(int, test_int_complex); // expected-error {{size of '__builtin_bit_cast' source type 'const _Complex unsigned int' does not match destination type 'int' (8 vs 4 bytes)}}
}
+
+namespace InvalidBaseClass {
+ class F {
+ public:
+ char c;
+ };
+
+ class InBetween : public F{};
+ class E : public InBetween {
+ public:
+ constexpr E() : F{3} {} // expected-error {{not a direct or virtual base}}
+ };
+ static_assert(__builtin_bit_cast(char, E()) == 0); // expected-error {{not an integral constant expression}}
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/132270
More information about the cfe-commits
mailing list