mirror of
https://github.com/ziglang/zig.git
synced 2025-12-16 03:03:09 +00:00
Return zero for NaN-to-int lossy casts
Fixes #15038. The goal here is to guarantee lossyCast() is panic-free and always safe.
This commit is contained in:
parent
b403ca0aab
commit
cc56577edf
@ -1214,7 +1214,9 @@ pub fn lossyCast(comptime T: type, value: anytype) T {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
.Float, .ComptimeFloat => {
|
.Float, .ComptimeFloat => {
|
||||||
if (value >= maxInt(T)) {
|
if (isNan(value)) {
|
||||||
|
return 0;
|
||||||
|
} else if (value >= maxInt(T)) {
|
||||||
return @as(T, maxInt(T));
|
return @as(T, maxInt(T));
|
||||||
} else if (value <= minInt(T)) {
|
} else if (value <= minInt(T)) {
|
||||||
return @as(T, minInt(T));
|
return @as(T, minInt(T));
|
||||||
@ -1234,6 +1236,7 @@ test "lossyCast" {
|
|||||||
try testing.expect(lossyCast(u32, @as(i16, -255)) == @as(u32, 0));
|
try testing.expect(lossyCast(u32, @as(i16, -255)) == @as(u32, 0));
|
||||||
try testing.expect(lossyCast(i9, @as(u32, 200)) == @as(i9, 200));
|
try testing.expect(lossyCast(i9, @as(u32, 200)) == @as(i9, 200));
|
||||||
try testing.expect(lossyCast(u32, @as(f32, maxInt(u32))) == maxInt(u32));
|
try testing.expect(lossyCast(u32, @as(f32, maxInt(u32))) == maxInt(u32));
|
||||||
|
try testing.expect(lossyCast(u32, nan(f32)) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Performs linear interpolation between *a* and *b* based on *t*.
|
/// Performs linear interpolation between *a* and *b* based on *t*.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user