From 17d214a249e8d28aa01bc89325ba57918d5bb525 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 25 Mar 2022 13:27:03 +0200 Subject: [PATCH] Sema: implement zirStructInit for runtime-known union values --- src/Sema.zig | 4 +++- test/behavior/union.zig | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Sema.zig b/src/Sema.zig index 1896ee40df..c8e12d21cc 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -12264,7 +12264,9 @@ fn zirStructInit( return alloc; } - return sema.fail(block, src, "TODO: Sema.zirStructInit for runtime-known union values", .{}); + try sema.requireRuntimeBlock(block, src); + try sema.queueFullTypeResolution(resolved_ty); + return block.addUnionInit(resolved_ty, field_index, init_inst); } unreachable; } diff --git a/test/behavior/union.zig b/test/behavior/union.zig index 0541817145..532d4f79eb 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -1132,3 +1132,20 @@ test "global variable struct contains union initialized to non-most-aligned fiel T.s.u.a += 1; try expect(T.s.u.a == 4); } + +test "union with no result loc initiated with a runtime value" { + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + + const U = union { + a: u32, + b: u32, + fn foo(u: @This()) void { + _ = u; + } + }; + var a: u32 = 1; + U.foo(U{ .a = a }); +}