[clang] 6dcb422 - [clang][bytecode] Reject uninitialized bases in builtin_bit_cast (#194625)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 30 01:50:11 PDT 2026
Author: Timm Baeder
Date: 2026-04-30T10:50:05+02:00
New Revision: 6dcb422a18e02acf7489f6dc68fa3e607017b918
URL: https://github.com/llvm/llvm-project/commit/6dcb422a18e02acf7489f6dc68fa3e607017b918
DIFF: https://github.com/llvm/llvm-project/commit/6dcb422a18e02acf7489f6dc68fa3e607017b918.diff
LOG: [clang][bytecode] Reject uninitialized bases in builtin_bit_cast (#194625)
Like the current interpreter does. Also use the bytecode interpreter in
the test in SemaCXX/.
Added:
Modified:
clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp
clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp b/clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp
index e48b0dc8e6a3e..5f90b419f1bfb 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltinBitCast.cpp
@@ -154,6 +154,9 @@ static Result enumerateData(const Pointer &P, const Context &Ctx, Bits Offset,
}
for (const Record::Base &B : R->bases()) {
Pointer Elem = P.atField(B.Offset);
+ if (!Initialize && !Elem.isInitialized())
+ return Result::Failure;
+
CharUnits ByteOffset =
Layout.getBaseClassOffset(cast<CXXRecordDecl>(B.Decl));
Bits BitOffset = Offset + Bits(Ctx.getASTContext().toBits(ByteOffset));
diff --git a/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp b/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
index 839de82744379..ea5333df0b469 100644
--- a/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
+++ b/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
@@ -2,6 +2,11 @@
// RUN: %clang_cc1 -verify -std=c++2a -fsyntax-only -triple x86_64-apple-macosx10.14.0 %s -fno-signed-char
// RUN: %clang_cc1 -verify -std=c++2a -fsyntax-only -triple aarch64_be-linux-gnu %s
+// RUN: %clang_cc1 -verify -std=c++2a -fsyntax-only -triple x86_64-apple-macosx10.14.0 %s -fexperimental-new-constant-interpreter -DBYTECODE
+// RUN: %clang_cc1 -verify -std=c++2a -fsyntax-only -triple x86_64-apple-macosx10.14.0 %s -fno-signed-char -fexperimental-new-constant-interpreter -DBYTECODE
+// RUN: %clang_cc1 -verify -std=c++2a -fsyntax-only -triple aarch64_be-linux-gnu %s -fexperimental-new-constant-interpreter -DBYTECODE
+
+
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
# define LITTLE_END 1
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
@@ -132,6 +137,9 @@ void test_partially_initialized() {
static_assert(fine.x == 1 && fine.y == 5);
}
+/// This works in the bytecode interpreter and is tested
+/// in test/AST/ByteCode/builtin-bit-cast-bitfields.cpp
+#ifndef BYTECODE
void no_bitfields() {
// FIXME!
struct S {
@@ -147,6 +155,7 @@ void no_bitfields() {
// expected-note at +1 {{constexpr bit_cast involving bit-field is not yet supported}}
constexpr G g = __builtin_bit_cast(G, s);
}
+#endif
void array_members() {
struct S {
More information about the cfe-commits
mailing list