From 83a3365bfd9dc17067de26b3cb4c9af55a34644e Mon Sep 17 00:00:00 2001 From: mlugg Date: Sat, 13 Sep 2025 11:31:17 +0100 Subject: [PATCH] std.math.big.int: normalize zero result for small multiplications Resolves: #25221 --- lib/std/math/big/int.zig | 7 +++---- test/behavior/enum.zig | 7 +++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/std/math/big/int.zig b/lib/std/math/big/int.zig index b0380444f4..427f2861b7 100644 --- a/lib/std/math/big/int.zig +++ b/lib/std/math/big/int.zig @@ -786,11 +786,10 @@ pub const Mutable = struct { assert(rma.limbs.ptr != b.limbs.ptr); // illegal aliasing if (a.limbs.len == 1 and b.limbs.len == 1) { - const ov = @mulWithOverflow(a.limbs[0], b.limbs[0]); - rma.limbs[0] = ov[0]; - if (ov[1] == 0) { + rma.limbs[0], const overflow_bit = @mulWithOverflow(a.limbs[0], b.limbs[0]); + if (overflow_bit == 0) { rma.len = 1; - rma.positive = (a.positive == b.positive); + rma.positive = (a.positive == b.positive) or rma.limbs[0] == 0; return; } } diff --git a/test/behavior/enum.zig b/test/behavior/enum.zig index d719a611e6..269fba13ba 100644 --- a/test/behavior/enum.zig +++ b/test/behavior/enum.zig @@ -1325,3 +1325,10 @@ test "large enum field values" { try expect(@intFromEnum(e) == std.math.maxInt(i128)); } } + +test "comptime @enumFromInt with signed arithmetic" { + const E = enum(i8) { foo = -1, bar = 0 }; + const x: E = @enumFromInt(@as(i8, -1) * 0); + comptime assert(x == .bar); + comptime assert(@intFromEnum(x) == 0); +}