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(...@@ -12264,7 +12264,9 @@ fn zirStructInit(
12264 return alloc;12264 return alloc;
12265 }12265 }
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);
12268 }12270 }
12269 unreachable;12271 unreachable;
12270}12272}
test/behavior/union.zig+17
...@@ -1132,3 +1132,20 @@ test "global variable struct contains union initialized to non-most-aligned fiel...@@ -1132,3 +1132,20 @@ test "global variable struct contains union initialized to non-most-aligned fiel
1132 T.s.u.a += 1;1132 T.s.u.a += 1;
1133 try expect(T.s.u.a == 4);1133 try expect(T.s.u.a == 4);
1134}1134}
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}