https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/132270
In error cases, the base might be None. Fixes https://github.com/llvm/llvm-project/issues/132257 >From 63f8f058a14286bd29a2c54307a90d326ac57aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Thu, 20 Mar 2025 19:28:00 +0100 Subject: [PATCH] [clang][ExprConst] Check record base classes for valid structs In error cases, the base might be None. Fixes https://github.com/llvm/llvm-project/issues/132257 --- clang/lib/AST/ExprConstant.cpp | 7 ++++++- clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) 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}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits