https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/191772
>From a9a299cace4a0e2e8c0ea90afce93013ab8e8829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Mon, 13 Apr 2026 10:20:54 +0200 Subject: [PATCH] asdf --- clang/lib/AST/ByteCode/Interp.cpp | 2 ++ clang/lib/AST/ByteCode/Pointer.cpp | 5 +++++ clang/test/AST/ByteCode/placement-new.cpp | 26 +++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp index f4d6ef4dc8bd6..abcf55bfa670d 100644 --- a/clang/lib/AST/ByteCode/Interp.cpp +++ b/clang/lib/AST/ByteCode/Interp.cpp @@ -1991,6 +1991,8 @@ bool CheckNewTypeMismatch(InterpState &S, CodePtr OpPC, const Expr *E, const Pointer &Ptr = S.Stk.peek<Pointer>(); auto directBaseIsUnion = [](const Pointer &Ptr) -> bool { + if (Ptr.isArrayElement()) + return false; const Record *R = Ptr.getBase().getRecord(); return R && R->isUnion(); }; diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp index 16c364d279020..a0a1c64bfd975 100644 --- a/clang/lib/AST/ByteCode/Pointer.cpp +++ b/clang/lib/AST/ByteCode/Pointer.cpp @@ -669,6 +669,11 @@ void Pointer::activate() const { }; Pointer B = *this; + // Primitive array elements can't be activated individually, so + // look at the array root instead. + if (B.getFieldDesc()->isPrimitiveArray() && B.isArrayElement()) + B = B.getArray(); + while (!B.isRoot() && B.inUnion()) { activate(B); diff --git a/clang/test/AST/ByteCode/placement-new.cpp b/clang/test/AST/ByteCode/placement-new.cpp index 6091ab5602121..5bad616a0d359 100644 --- a/clang/test/AST/ByteCode/placement-new.cpp +++ b/clang/test/AST/ByteCode/placement-new.cpp @@ -539,3 +539,29 @@ namespace DirectBaseHasNoRecord { static_assert(test_multidim_single_start() == 13); // both-error {{not an integral constant expression}} \ // both-note {{in call to}} } + +namespace PrimArray { + constexpr int test_start_lifetime_array() { + struct S { + union { int storage[4]; }; + }; + S s; + s.storage[0] = 10; + ::new (&s.storage[0]) int(10); + ::new (&s.storage[1]) int(20); + return s.storage[0] + s.storage[1]; + } + static_assert(test_start_lifetime_array() == 30); + + + constexpr int primElem() { + union {int a[2]; }; + + new (&a[1]) int(30); // both-note {{construction of subobject of member 'a' of union with no active member is not allowed in a constant expression}} + return a[1]; + } + static_assert(primElem() == 30); // both-error {{not an integral constant expression}} \ + // both-note {{in call to}} + + +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
