From cad14d111e7adb7efbf3727ce20c5ce23e79f82b Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Fri, 10 Jul 2026 12:52:16 +0100 Subject: [PATCH 1/3] Translate unions in C++ --- cpp2rust/converter/converter.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cpp2rust/converter/converter.cpp b/cpp2rust/converter/converter.cpp index 8cb26e93..a4c0ef1f 100644 --- a/cpp2rust/converter/converter.cpp +++ b/cpp2rust/converter/converter.cpp @@ -891,6 +891,11 @@ bool Converter::VisitCXXRecordDecl(clang::CXXRecordDecl *decl) { } } + EmitRustStructOrUnion(decl); + } else if (decl->isUnion()) { + if (!record_decls_.MarkDefined(GetRecordName(decl))) { + return false; + } EmitRustStructOrUnion(decl); } else { // FIXME: improve error handling From 03949d8e033512166af9ff971cb548e16a4e3786 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Mon, 13 Jul 2026 22:10:04 +0100 Subject: [PATCH 2/3] Move union basic to C++ --- tests/unit/{union_basic.c => union_basic.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/unit/{union_basic.c => union_basic.cpp} (100%) diff --git a/tests/unit/union_basic.c b/tests/unit/union_basic.cpp similarity index 100% rename from tests/unit/union_basic.c rename to tests/unit/union_basic.cpp From 8d9f49cd9a296fea82e07770904af54e52d53847 Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Mon, 13 Jul 2026 22:10:34 +0100 Subject: [PATCH 3/3] Update tests --- tests/unit/out/refcount/union_basic.rs | 6 +++--- tests/unit/out/unsafe/union_basic.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit/out/refcount/union_basic.rs b/tests/unit/out/refcount/union_basic.rs index 0a509632..a9bd9e73 100644 --- a/tests/unit/out/refcount/union_basic.rs +++ b/tests/unit/out/refcount/union_basic.rs @@ -48,10 +48,10 @@ pub fn main() { std::process::exit(main_0()); } fn main_0() -> i32 { - let u: Value = >::default(); + let u: Value = Rc::new(RefCell::new(::default())); (*u.borrow_mut()).i().write(42); - assert!((((((*u.borrow()).i().read()) == 42) as i32) != 0)); + assert!((((*u.borrow()).i().read()) == 42)); (*u.borrow_mut()).f().write(3.140000105E+0); - assert!((((((*u.borrow()).f().read()) == 3.140000105E+0) as i32) != 0)); + assert!((((*u.borrow()).f().read()) == 3.140000105E+0)); return 0; } diff --git a/tests/unit/out/unsafe/union_basic.rs b/tests/unit/out/unsafe/union_basic.rs index 43a45ff6..81e82df3 100644 --- a/tests/unit/out/unsafe/union_basic.rs +++ b/tests/unit/out/unsafe/union_basic.rs @@ -25,8 +25,8 @@ pub fn main() { unsafe fn main_0() -> i32 { let mut u: basic = ::default(); u.i = 42; - assert!(((((u.i) == (42)) as i32) != 0)); + assert!(((u.i) == (42))); u.f = 3.140000105E+0; - assert!(((((u.f) == (3.140000105E+0)) as i32) != 0)); + assert!(((u.f) == (3.140000105E+0))); return 0; }