-
Notifications
You must be signed in to change notification settings - Fork 12.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
std: Make abs() panic on overflow in debug mode #25441
Conversation
r? @brson (rust_highfive has picked a reviewer for you, use r? to override) |
r? @aturon |
@@ -569,7 +569,7 @@ macro_rules! int_impl { | |||
#[inline] | |||
pub fn abs(self) -> $T { | |||
if self.is_negative() { | |||
self.wrapping_neg() | |||
-self |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you leave a comment saying that this has the correct overflow semantics only if kept as inline
given how std is distributed? I hope we can do something more robust in the future.
Otherwise r=me.
Debug overflow checks for arithmetic negation landed in rust-lang#24500, at which time the `abs` method on signed integers was changed to using `wrapping_neg` to ensure that the function never panicked. This implied that `abs` of `INT_MIN` would return `INT_MIN`, another negative value. When this change was back-ported to beta, however, in rust-lang#24708, the `wrapping_neg` function had not yet been backported, so the implementation was changed in rust-lang#24785 to `!self + 1`. This change had the unintended side effect of enabling debug overflow checks for the `abs` function. Consequently, the current state of affairs is that the beta branch checks for overflow in debug mode for `abs` and the nightly branch does not. This commit alters the behavior of nightly to have `abs` always check for overflow in debug mode. This change is more consistent with the way the standard library treats overflow as well, and it is also not a breaking change as it's what the beta branch currently does (albeit if by accident). cc rust-lang#25378
2a05f77
to
5f39ceb
Compare
Debug overflow checks for arithmetic negation landed in #24500, at which time the `abs` method on signed integers was changed to using `wrapping_neg` to ensure that the function never panicked. This implied that `abs` of `INT_MIN` would return `INT_MIN`, another negative value. When this change was back-ported to beta, however, in #24708, the `wrapping_neg` function had not yet been backported, so the implementation was changed in #24785 to `!self + 1`. This change had the unintended side effect of enabling debug overflow checks for the `abs` function. Consequently, the current state of affairs is that the beta branch checks for overflow in debug mode for `abs` and the nightly branch does not. This commit alters the behavior of nightly to have `abs` always check for overflow in debug mode. This change is more consistent with the way the standard library treats overflow as well, and it is also not a breaking change as it's what the beta branch currently does (albeit if by accident). cc #25378
Hey, it broke the compiler
|
Accepting for a beta backport |
Debug overflow checks for arithmetic negation landed in #24500, at which time
the
abs
method on signed integers was changed to usingwrapping_neg
toensure that the function never panicked. This implied that
abs
ofINT_MIN
would return
INT_MIN
, another negative value. When this change was back-portedto beta, however, in #24708, the
wrapping_neg
function had not yet beenbackported, so the implementation was changed in #24785 to
!self + 1
. Thischange had the unintended side effect of enabling debug overflow checks for the
abs
function. Consequently, the current state of affairs is that the betabranch checks for overflow in debug mode for
abs
and the nightly branch doesnot.
This commit alters the behavior of nightly to have
abs
always check foroverflow in debug mode. This change is more consistent with the way the standard
library treats overflow as well, and it is also not a breaking change as it's
what the beta branch currently does (albeit if by accident).
cc #25378