Skip to content

[clang][bytecode] Fix non-defaulted union copy/move ctors#199394

Open
tbaederr wants to merge 1 commit into
llvm:mainfrom
tbaederr:union-copy-ctor
Open

[clang][bytecode] Fix non-defaulted union copy/move ctors#199394
tbaederr wants to merge 1 commit into
llvm:mainfrom
tbaederr:union-copy-ctor

Conversation

@tbaederr
Copy link
Copy Markdown
Contributor

They are like regular record ctors.

@llvmorg-github-actions llvmorg-github-actions Bot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:bytecode Issues for the clang bytecode constexpr interpreter labels May 24, 2026
@llvmorg-github-actions
Copy link
Copy Markdown

@llvm/pr-subscribers-clang

Author: Timm Baeder (tbaederr)

Changes

They are like regular record ctors.


Full diff: https://github.com/llvm/llvm-project/pull/199394.diff

2 Files Affected:

  • (modified) clang/lib/AST/ByteCode/Compiler.cpp (+2-2)
  • (modified) clang/test/AST/ByteCode/unions.cpp (+12)
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..17d868325f1a7 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 U() : a(100) {}
+    constexpr U(const U &u) {
+      a = 20;
+    };
+  };
+  constexpr U u2;
+  constexpr U u22(u2);
+  static_assert(u22.a == 20);
 }
 
 namespace UnionInBase {

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 24, 2026

🐧 Linux x64 Test Results

  • 118034 tests passed
  • 4767 tests skipped

✅ The build succeeded and all tests passed.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 24, 2026

🪟 Windows x64 Test Results

  • 55646 tests passed
  • 2601 tests skipped

✅ The build succeeded and all tests passed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:bytecode Issues for the clang bytecode constexpr interpreter clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant