Skip to content

Commit 32a1aab

Browse files
committed
std.math.big.int: normalize zero result for small multiplications
Resolves: #25221
1 parent a0ec4e2 commit 32a1aab

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

lib/std/math/big/int.zig

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -786,11 +786,10 @@ pub const Mutable = struct {
786786
assert(rma.limbs.ptr != b.limbs.ptr); // illegal aliasing
787787

788788
if (a.limbs.len == 1 and b.limbs.len == 1) {
789-
const ov = @mulWithOverflow(a.limbs[0], b.limbs[0]);
790-
rma.limbs[0] = ov[0];
791-
if (ov[1] == 0) {
789+
rma.limbs[0], const overflow_bit = @mulWithOverflow(a.limbs[0], b.limbs[0]);
790+
if (overflow_bit == 0) {
792791
rma.len = 1;
793-
rma.positive = (a.positive == b.positive);
792+
rma.positive = (a.positive == b.positive) or rma.limbs[0] == 0;
794793
return;
795794
}
796795
}

test/behavior/enum.zig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,3 +1325,10 @@ test "large enum field values" {
13251325
try expect(@intFromEnum(e) == std.math.maxInt(i128));
13261326
}
13271327
}
1328+
1329+
test "comptime @enumFromInt with signed arithmetic" {
1330+
const E = enum(i8) { foo = -1, bar = 0 };
1331+
const x: E = @enumFromInt(@as(i8, -1) * 0);
1332+
comptime assert(x == .bar);
1333+
comptime assert(@intFromEnum(x) == 0);
1334+
}

0 commit comments

Comments
 (0)