From e382e7be2b7a4c40a8db78dca0de38141dad8c67 Mon Sep 17 00:00:00 2001 From: Evan Haas Date: Sat, 5 Feb 2022 22:18:31 -0800 Subject: std: Allow `mem.zeroes` to work at comptime with extern union Fixes #10797 --- lib/std/mem.zig | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib/std') diff --git a/lib/std/mem.zig b/lib/std/mem.zig index 71de42aad7..5ca7faf90b 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -309,9 +309,7 @@ pub fn zeroes(comptime T: type) T { if (comptime meta.containerLayout(T) == .Extern) { // The C language specification states that (global) unions // should be zero initialized to the first named member. - var item: T = undefined; - @field(item, info.fields[0].name) = zeroes(@TypeOf(@field(item, info.fields[0].name))); - return item; + return @unionInit(T, info.fields[0].name, zeroes(info.fields[0].field_type)); } @compileError("Can't set a " ++ @typeName(T) ++ " to zero."); @@ -417,6 +415,9 @@ test "mem.zeroes" { var c = zeroes(C_union); try testing.expectEqual(@as(u8, 0), c.a); + + comptime var comptime_union = zeroes(C_union); + try testing.expectEqual(@as(u8, 0), comptime_union.a); } /// Initializes all fields of the struct with their default value, or zero values if no default value is present. -- cgit v1.2.3