From ab3ac1e6701431ae7dea99b23852e36b369d6b87 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Wed, 27 Sep 2023 10:41:03 +0300 Subject: [PATCH] Value: fix assertion failure when mutating extern union Closes #17292 --- src/value.zig | 6 +++++- test/behavior/union.zig | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/value.zig b/src/value.zig index 279f52e3e0..e7029369e7 100644 --- a/src/value.zig +++ b/src/value.zig @@ -398,7 +398,11 @@ pub const Value = struct { }, .un => |un| Tag.@"union".create(arena, .{ - .tag = un.tag.toValue(), + // toValue asserts that the value cannot be .none which is valid on unions. + .tag = .{ + .ip_index = un.tag, + .legacy = undefined, + }, .val = un.val.toValue(), }), diff --git a/test/behavior/union.zig b/test/behavior/union.zig index 47e0b2f345..bc3a7b044d 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -1662,3 +1662,16 @@ test "union with 128 bit integer" { } } } + +test "memset extern union at comptime" { + const U = extern union { + foo: u8, + }; + const u = comptime blk: { + var u: U = undefined; + @memset(std.mem.asBytes(&u), 0); + u.foo = 0; + break :blk u; + }; + try expect(u.foo == 0); +}