From 0a9d6956e7cac96c870ad062b4125b0a0a3b0143 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 12 Jun 2022 17:52:30 +0300 Subject: [PATCH] Sema: add missing set_union_tag --- lib/std/io/stream_source.zig | 1 - lib/std/json.zig | 1 - lib/std/os/linux/io_uring.zig | 2 -- src/Sema.zig | 4 +++- test/behavior/union.zig | 18 ++++++++++++++++++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/std/io/stream_source.zig b/lib/std/io/stream_source.zig index 2345a978557b89c2df815026898862813c51cf6e..ce5256028c04f1ed9c567e514925667342b97155 100644 --- a/lib/std/io/stream_source.zig +++ b/lib/std/io/stream_source.zig @@ -114,7 +114,6 @@ test "StreamSource (mutable buffer)" { } test "StreamSource (const buffer)" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; const buffer: [64]u8 = "Hello, World!".* ++ ([1]u8{0xAA} ** 51); var source = StreamSource{ .const_buffer = std.io.fixedBufferStream(&buffer) }; diff --git a/lib/std/json.zig b/lib/std/json.zig index 2e09818b6f04b6bfe7d580747db484207d5b57c9..cc82c1d0a55b2f23a7ec91c9422ebc2ff347935b 100644 --- a/lib/std/json.zig +++ b/lib/std/json.zig @@ -1355,7 +1355,6 @@ pub const Value = union(enum) { }; test "Value.jsonStringify" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO { var buffer: [10]u8 = undefined; var fbs = std.io.fixedBufferStream(&buffer); diff --git a/lib/std/os/linux/io_uring.zig b/lib/std/os/linux/io_uring.zig index e7ac17a1af86a9cae80d98662d7dca189f11a835..144927771f0bc9bc40db3300de12861a1dbed67e 100644 --- a/lib/std/os/linux/io_uring.zig +++ b/lib/std/os/linux/io_uring.zig @@ -2154,7 +2154,6 @@ test "timeout (after a number of completions)" { } test "timeout_remove" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO if (builtin.os.tag != .linux) return error.SkipZigTest; var ring = IO_Uring.init(2, 0) catch |err| switch (err) { @@ -2951,7 +2950,6 @@ test "provide_buffers: read" { } test "remove_buffers" { - if (@import("builtin").zig_backend != .stage1) return error.SkipZigTest; // TODO if (builtin.os.tag != .linux) return error.SkipZigTest; var ring = IO_Uring.init(1, 0) catch |err| switch (err) { diff --git a/src/Sema.zig b/src/Sema.zig index f0eb67ec265b20fcc906a70f81fa8cca2166a9be..5ad9cacff9ade2658de6e02edbdc113c8f65db56 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -13757,10 +13757,10 @@ fn zirStructInit( const field_type_extra = sema.code.extraData(Zir.Inst.FieldType, field_type_data.payload_index).data; const field_name = sema.code.nullTerminatedString(field_type_extra.name_start); const field_index = try sema.unionFieldIndex(block, resolved_ty, field_name, field_src); + const tag_val = try Value.Tag.enum_field_index.create(sema.arena, field_index); const init_inst = try sema.resolveInst(item.data.init); if (try sema.resolveMaybeUndefVal(block, field_src, init_inst)) |val| { - const tag_val = try Value.Tag.enum_field_index.create(sema.arena, field_index); return sema.addConstantMaybeRef( block, src, @@ -13779,6 +13779,8 @@ fn zirStructInit( const alloc = try block.addTy(.alloc, alloc_ty); const field_ptr = try sema.unionFieldPtr(block, field_src, alloc, field_name, field_src, resolved_ty); try sema.storePtr(block, src, field_ptr, init_inst); + const new_tag = try sema.addConstant(resolved_ty.unionTagTypeHypothetical(), tag_val); + _ = try block.addBinOp(.set_union_tag, alloc, new_tag); return alloc; } diff --git a/test/behavior/union.zig b/test/behavior/union.zig index 4daa9c1ee51d19dd2064cdd6c9b996f6f597eed4..caa5d26aea3e44a3a5cc4ffffe6208ce51399054 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -1183,3 +1183,21 @@ test "comptime equality of extern unions with same tag" { const b = S.U{ .a = 1234 }; try expect(S.foo(a) == S.foo(b)); } + +test "union tag is set when initiated as a temporary value at runtime" { + 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 + + const U = union(enum) { + a, + b: u32, + c, + + fn doTheTest(u: @This()) !void { + try expect(u == .b); + } + }; + var b: u32 = 1; + try (U{ .b = b }).doTheTest(); +} -- 2.54.0