diff options
| -rw-r--r-- | library/core/src/num/int_macros.rs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/library/core/src/num/int_macros.rs b/library/core/src/num/int_macros.rs index 36b6d6e774e..a6deb3f65ec 100644 --- a/library/core/src/num/int_macros.rs +++ b/library/core/src/num/int_macros.rs @@ -2068,10 +2068,14 @@ macro_rules! int_impl { pub const fn rem_euclid(self, rhs: Self) -> Self { let r = self % rhs; if r < 0 { - // if rhs is `integer::MIN`, rhs.wrapping_abs() == rhs.wrapping_abs, - // thus r.wrapping_add(rhs.wrapping_abs()) == r.wrapping_add(rhs) == r - rhs, - // which suits our need. - // otherwise, rhs.wrapping_abs() == -rhs, which won't overflow since r is negative. + // Semantically equivalent to `if rhs < 0 { r - rhs } else { r + rhs }`. + // If `rhs` is not `Self::MIN`, then `r + abs(rhs)` will not overflow + // and is clearly equivalent, because `r` is negative. + // Otherwise, `rhs` is `Self::MIN`, then we have + // `r.wrapping_add(Self::MIN.wrapping_abs())`, which evaluates + // to `r.wrapping_add(Self::MIN)`, which is equivalent to + // `r - Self::MIN`, which is what we wanted (and will not overflow + // for negative `r`). r.wrapping_add(rhs.wrapping_abs()) } else { r |
