Skip to content

Commit 745f771

Browse files
authored
Rollup merge of #67845 - jumbatm:also-unconst-hack-abs, r=oli-obk
Also remove const-hack for abs Closes #67842. r? @oli-obk
2 parents 689e29f + ae002c1 commit 745f771

File tree

1 file changed

+6
-18
lines changed

1 file changed

+6
-18
lines changed

src/libcore/num/mod.rs

+6-18
Original file line numberDiff line numberDiff line change
@@ -1997,27 +1997,15 @@ $EndFeature, "
19971997
```"),
19981998
#[stable(feature = "rust1", since = "1.0.0")]
19991999
#[rustc_const_stable(feature = "const_int_methods", since = "1.32.0")]
2000+
#[allow_internal_unstable(const_if_match)]
20002001
#[inline]
20012002
#[rustc_inherit_overflow_checks]
20022003
pub const fn abs(self) -> Self {
2003-
// Note that the #[inline] above means that the overflow
2004-
// semantics of the subtraction depend on the crate we're being
2005-
// inlined into.
2006-
2007-
// sign is -1 (all ones) for negative numbers, 0 otherwise.
2008-
let sign = self >> ($BITS - 1);
2009-
// For positive self, sign == 0 so the expression is simply
2010-
// (self ^ 0) - 0 == self == abs(self).
2011-
//
2012-
// For negative self, self ^ sign == self ^ all_ones.
2013-
// But all_ones ^ self == all_ones - self == -1 - self.
2014-
// So for negative numbers, (self ^ sign) - sign is
2015-
// (-1 - self) - -1 == -self == abs(self).
2016-
//
2017-
// The subtraction overflows when self is min_value(), because
2018-
// (-1 - min_value()) - -1 is max_value() - -1 which overflows.
2019-
// This is exactly when we want self.abs() to overflow.
2020-
(self ^ sign) - sign
2004+
if self.is_negative() {
2005+
-self
2006+
} else {
2007+
self
2008+
}
20212009
}
20222010
}
20232011

0 commit comments

Comments
 (0)