diff --git a/lib/std/zon/parse.zig b/lib/std/zon/parse.zig index d557956484a8c8a6bcd75433b2956b17c6a3a6c6..249dc9b644ce80553568bfd5dfb77291ec6bf60c 100644 --- a/lib/std/zon/parse.zig +++ b/lib/std/zon/parse.zig @@ -1173,7 +1173,9 @@ const Parser = struct { }; fn intFromFloatExact(T: type, value: anytype) ?T { - if (value > std.math.maxInt(T) or value < std.math.minInt(T)) { + const max: @TypeOf(value) = @floatFromInt(std.math.maxInt(T)); + const min: @TypeOf(value) = @floatFromInt(std.math.minInt(T)); + if (value > max or value < min) { return null; } @@ -2448,6 +2450,7 @@ test "std.zon intFromFloatExact" { try std.testing.expectEqual(@as(u8, 10), intFromFloatExact(u8, @as(f32, 10.0)).?); try std.testing.expectEqual(@as(i8, -123), intFromFloatExact(i8, @as(f64, @as(f64, -123.0))).?); try std.testing.expectEqual(@as(i16, 45), intFromFloatExact(i16, @as(f128, @as(f128, 45.0))).?); + try std.testing.expectEqual(@as(u128, 67), intFromFloatExact(u128, @as(f128, @as(f128, 67.0))).?); // Out of range try std.testing.expectEqual(@as(?u4, null), intFromFloatExact(u4, @as(f32, 16.0))); @@ -2490,6 +2493,10 @@ test "std.zon parse int" { @as(u65, 36893488147419103231), try fromSlice(u65, gpa, "368934_881_474191032_31", null, .{}), ); + try std.testing.expectEqual( + @as(u128, 340282366920938463463374607431768211455), + try fromSlice(u128, gpa, "340282366920938463463374607431768211455", null, .{}), + ); // Test big integer limits try std.testing.expectEqual(