zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 6daa37ded905431f3a25508a42590031b0905ab9 (tree)
parent 9edfccb9a7d23dbf02444023d042d5008a39462e
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date:   Sat, 31 May 2025 23:39:35 -0400

x86_64: fix packed struct equality

Closes #22990

Diffstat:
Msrc/arch/x86_64/CodeGen.zig | 20++++++++++++++++++--
Mtest/behavior/packed-struct.zig | 11+++++++++++
2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig @@ -77309,11 +77309,27 @@ fn genBody(cg: *CodeGen, body: []const Air.Inst.Index) InnerError!void { }, } }, - .int => res[0] = ops[0].cmpInts(cmp_op, &ops[1], cg) catch |err| break :err err, + .int => { + switch (ty.zigTypeTag(zcu)) { + else => {}, + .@"struct", .@"union" => { + assert(ty.containerLayout(zcu) == .@"packed"); + for (&ops) |*op| op.wrapInt(cg) catch |err| switch (err) { + error.SelectFailed => return cg.fail("failed to select {s} wrap {} {}", .{ + @tagName(air_tag), + ty.fmt(pt), + op.tracking(cg), + }), + else => |e| return e, + }; + }, + } + res[0] = ops[0].cmpInts(cmp_op, &ops[1], cg) catch |err| break :err err; + }, }) catch |err| switch (err) { error.SelectFailed => return cg.fail("failed to select {s} {} {} {}", .{ @tagName(air_tag), - cg.typeOf(bin_op.lhs).fmt(pt), + ty.fmt(pt), ops[0].tracking(cg), ops[1].tracking(cg), }), diff --git a/test/behavior/packed-struct.zig b/test/behavior/packed-struct.zig @@ -1307,6 +1307,17 @@ test "packed struct equality" { comptime try S.doTest(x, y); } +test "packed struct equality ignores padding bits" { + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = packed struct { b: bool }; + var s: S = undefined; + s.b = true; + try std.testing.expect(s != S{ .b = false }); + try std.testing.expect(s == S{ .b = true }); +} + test "packed struct with signed field" { var s: packed struct { a: i2,