https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/199394
>From 1a10e1b0ac7aa94d0354049e8bdd7636222475ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Sun, 24 May 2026 06:42:58 +0200 Subject: [PATCH] [clang][bytecode] Fix non-defaulted union copy/move ctors They are like regular record ctors. --- clang/lib/AST/ByteCode/Compiler.cpp | 4 ++-- clang/test/AST/ByteCode/unions.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 4d13cd7139f83..1e58d91861ad5 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -6856,8 +6856,8 @@ bool Compiler<Emitter>::compileConstructor(const CXXConstructorDecl *Ctor) { return false; bool IsUnion = R->isUnion(); - // Union copy and move ctors are special. - if (IsUnion && Ctor->isCopyOrMoveConstructor()) { + // Default union copy and move ctors are special. + if (IsUnion && Ctor->isCopyOrMoveConstructor() && Ctor->isDefaulted()) { LocOverrideScope<Emitter> LOS(this, SourceInfo{}); // No special case for NumFields == 0 here, so the Memcpy op diff --git a/clang/test/AST/ByteCode/unions.cpp b/clang/test/AST/ByteCode/unions.cpp index 399c4c891be00..5f3676785fde6 100644 --- a/clang/test/AST/ByteCode/unions.cpp +++ b/clang/test/AST/ByteCode/unions.cpp @@ -386,6 +386,18 @@ namespace CopyCtor { static_assert(y.a == 42, ""); static_assert(y.b == 42, ""); // both-error {{constant expression}} \ // both-note {{'b' of union with active member 'a'}} + + /// Non-defaulted copy ctor. + union U2 { + int a; + constexpr U2() : a(100) {} + constexpr U2(const U2 &u) { + a = 20; + }; + }; + constexpr U2 u2; + constexpr U2 u22(u2); + static_assert(u22.a == 20, ""); } namespace UnionInBase { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
