From 80d84537f7c7002c29a39a429072f59303f7d0f7 Mon Sep 17 00:00:00 2001 From: Hila Friedman Date: Thu, 12 Mar 2026 13:38:06 +0100 Subject: [PATCH] allow `packed union` comparisons in `std.meta.eql` (#31479) #31464 implemented equality testing for `packed union`s - this PR updates `std.meta.eql`'s implementation to accept them. Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31479 Co-authored-by: Hila Friedman Co-committed-by: Hila Friedman --- lib/std/meta.zig | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/std/meta.zig b/lib/std/meta.zig index 632c65678f28107c8f20444c68a74d27cae02309..543157012a1ca18bad490280d7c35801273ac476 100644 --- a/lib/std/meta.zig +++ b/lib/std/meta.zig @@ -636,22 +636,22 @@ pub fn eql(a: anytype, b: @TypeOf(a)) bool { } }, .@"union" => |info| { - if (info.tag_type) |UnionTag| { - const tag_a: UnionTag = a; - const tag_b: UnionTag = b; - if (tag_a != tag_b) return false; + if (info.layout == .@"packed") return a == b; + const UnionTag = info.tag_type orelse + @compileError("cannot compare untagged union type " ++ @typeName(T)); - return switch (a) { - inline else => |val, tag| return eql(val, @field(b, @tagName(tag))), - }; - } + const tag_a: UnionTag = a; + const tag_b: UnionTag = b; + if (tag_a != tag_b) return false; - @compileError("cannot compare untagged union type " ++ @typeName(T)); + return switch (a) { + inline else => |val, tag| return eql(val, @field(b, @tagName(tag))), + }; }, .array => { - if (a.len != b.len) return false; - for (a, 0..) |e, i| - if (!eql(e, b[i])) return false; + for (a, b) |x, y| { + if (!eql(x, y)) return false; + } return true; }, .vector => return @reduce(.And, a == b), @@ -662,9 +662,9 @@ pub fn eql(a: anytype, b: @TypeOf(a)) bool { }; }, .optional => { - if (a == null and b == null) return true; - if (a == null or b == null) return false; - return eql(a.?, b.?); + const some_a = a orelse return b == null; + const some_b = b orelse return false; + return eql(some_a, some_b); }, else => return a == b, } -- 2.54.0