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 1896ee40df5765784ce4faf4e74557201bf2cf10..c8e12d21ccc510d92ccb9dd9d945386ca92b508e 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 05418171451ddd6794520e2e8bab56c2746dec39..532d4f79ebaadb6c8cc1a06abeb627ff1ed9778f 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 }); +} -- 2.54.0