Commit 32a1aabff7

mlugg <mlugg@mlugg.co.uk>
2025-09-13 12:31:17
std.math.big.int: normalize zero result for small multiplications
Resolves: #25221
1 parent a0ec4e2
Changed files (2)
lib
std
math
test
behavior
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;
             }
         }
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);
+}