authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-25 13:27:03+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-25 22:32:15+02:00
log17d214a249e8d28aa01bc89325ba57918d5bb525
tree4a8b0b356a44458a4c8d33a5e04d99ce76c8396f
parent5ff518fbb9ea2fb5a745841731912acbe2f046d9

Sema: implement zirStructInit for runtime-known union values


2 files changed, 20 insertions(+), 1 deletions(-)

src/Sema.zig+3-1
......@@ -12264,7 +12264,9 @@ fn zirStructInit(
1226412264 return alloc;
1226512265 }
1226612266
12267 return sema.fail(block, src, "TODO: Sema.zirStructInit for runtime-known union values", .{});
12267 try sema.requireRuntimeBlock(block, src);
12268 try sema.queueFullTypeResolution(resolved_ty);
12269 return block.addUnionInit(resolved_ty, field_index, init_inst);
1226812270 }
1226912271 unreachable;
1227012272}
test/behavior/union.zig+17
......@@ -1132,3 +1132,20 @@ test "global variable struct contains union initialized to non-most-aligned fiel
11321132 T.s.u.a += 1;
11331133 try expect(T.s.u.a == 4);
11341134}
1135
1136test "union with no result loc initiated with a runtime value" {
1137 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1138 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1139 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1140 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1141
1142 const U = union {
1143 a: u32,
1144 b: u32,
1145 fn foo(u: @This()) void {
1146 _ = u;
1147 }
1148 };
1149 var a: u32 = 1;
1150 U.foo(U{ .a = a });
1151}