summaryrefslogtreecommitdiffstats
path: root/library/core/src/num
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
commit9918693037dce8aa4bb6f08741b6812923486c18 (patch)
tree21d2b40bec7e6a7ea664acee056eb3d08e15a1cf /library/core/src/num
parentReleasing progress-linux version 1.75.0+dfsg1-5~progress7.99u1. (diff)
downloadrustc-9918693037dce8aa4bb6f08741b6812923486c18.tar.xz
rustc-9918693037dce8aa4bb6f08741b6812923486c18.zip
Merging upstream version 1.76.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/core/src/num')
-rw-r--r--library/core/src/num/f32.rs14
-rw-r--r--library/core/src/num/f64.rs14
-rw-r--r--library/core/src/num/mod.rs6
-rw-r--r--library/core/src/num/nonzero.rs66
4 files changed, 73 insertions, 27 deletions
diff --git a/library/core/src/num/f32.rs b/library/core/src/num/f32.rs
index f60626b00..709eba2ff 100644
--- a/library/core/src/num/f32.rs
+++ b/library/core/src/num/f32.rs
@@ -1424,9 +1424,17 @@ impl f32 {
/// ];
///
/// bois.sort_by(|a, b| a.weight.total_cmp(&b.weight));
- /// # assert!(bois.into_iter().map(|b| b.weight)
- /// # .zip([-5.0, 0.1, 10.0, 99.0, f32::INFINITY, f32::NAN].iter())
- /// # .all(|(a, b)| a.to_bits() == b.to_bits()))
+ ///
+ /// // `f32::NAN` could be positive or negative, which will affect the sort order.
+ /// if f32::NAN.is_sign_negative() {
+ /// assert!(bois.into_iter().map(|b| b.weight)
+ /// .zip([f32::NAN, -5.0, 0.1, 10.0, 99.0, f32::INFINITY].iter())
+ /// .all(|(a, b)| a.to_bits() == b.to_bits()))
+ /// } else {
+ /// assert!(bois.into_iter().map(|b| b.weight)
+ /// .zip([-5.0, 0.1, 10.0, 99.0, f32::INFINITY, f32::NAN].iter())
+ /// .all(|(a, b)| a.to_bits() == b.to_bits()))
+ /// }
/// ```
#[stable(feature = "total_cmp", since = "1.62.0")]
#[must_use]
diff --git a/library/core/src/num/f64.rs b/library/core/src/num/f64.rs
index 0a87021d8..73fa61574 100644
--- a/library/core/src/num/f64.rs
+++ b/library/core/src/num/f64.rs
@@ -1422,9 +1422,17 @@ impl f64 {
/// ];
///
/// bois.sort_by(|a, b| a.weight.total_cmp(&b.weight));
- /// # assert!(bois.into_iter().map(|b| b.weight)
- /// # .zip([-5.0, 0.1, 10.0, 99.0, f64::INFINITY, f64::NAN].iter())
- /// # .all(|(a, b)| a.to_bits() == b.to_bits()))
+ ///
+ /// // `f64::NAN` could be positive or negative, which will affect the sort order.
+ /// if f64::NAN.is_sign_negative() {
+ /// assert!(bois.into_iter().map(|b| b.weight)
+ /// .zip([f64::NAN, -5.0, 0.1, 10.0, 99.0, f64::INFINITY].iter())
+ /// .all(|(a, b)| a.to_bits() == b.to_bits()))
+ /// } else {
+ /// assert!(bois.into_iter().map(|b| b.weight)
+ /// .zip([-5.0, 0.1, 10.0, 99.0, f64::INFINITY, f64::NAN].iter())
+ /// .all(|(a, b)| a.to_bits() == b.to_bits()))
+ /// }
/// ```
#[stable(feature = "total_cmp", since = "1.62.0")]
#[must_use]
diff --git a/library/core/src/num/mod.rs b/library/core/src/num/mod.rs
index 2a0b31404..695e87aaa 100644
--- a/library/core/src/num/mod.rs
+++ b/library/core/src/num/mod.rs
@@ -474,7 +474,7 @@ impl isize {
}
}
-/// If 6th bit is set ascii is lower case.
+/// If the 6th bit is set ascii is lower case.
const ASCII_CASE_MASK: u8 = 0b0010_0000;
impl u8 {
@@ -549,7 +549,7 @@ impl u8 {
#[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.52.0")]
#[inline]
pub const fn to_ascii_uppercase(&self) -> u8 {
- // Toggle the fifth bit if this is a lowercase letter
+ // Toggle the 6th bit if this is a lowercase letter
*self ^ ((self.is_ascii_lowercase() as u8) * ASCII_CASE_MASK)
}
@@ -574,7 +574,7 @@ impl u8 {
#[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.52.0")]
#[inline]
pub const fn to_ascii_lowercase(&self) -> u8 {
- // Set the fifth bit if this is an uppercase letter
+ // Set the 6th bit if this is an uppercase letter
*self | (self.is_ascii_uppercase() as u8 * ASCII_CASE_MASK)
}
diff --git a/library/core/src/num/nonzero.rs b/library/core/src/num/nonzero.rs
index 7f8d673c1..f5ecf501c 100644
--- a/library/core/src/num/nonzero.rs
+++ b/library/core/src/num/nonzero.rs
@@ -75,12 +75,12 @@ macro_rules! nonzero_integers {
#[must_use]
#[inline]
pub const unsafe fn new_unchecked(n: $Int) -> Self {
+ crate::panic::debug_assert_nounwind!(
+ n != 0,
+ concat!(stringify!($Ty), "::new_unchecked requires a non-zero argument")
+ );
// SAFETY: this is guaranteed to be safe by the caller.
unsafe {
- core::intrinsics::assert_unsafe_precondition!(
- concat!(stringify!($Ty), "::new_unchecked requires a non-zero argument"),
- (n: $Int) => n != 0
- );
Self(n)
}
}
@@ -353,8 +353,13 @@ macro_rules! nonzero_unsigned_operations {
#[inline]
pub const fn checked_add(self, other: $Int) -> Option<$Ty> {
if let Some(result) = self.get().checked_add(other) {
- // SAFETY: $Int::checked_add returns None on overflow
- // so the result cannot be zero.
+ // SAFETY:
+ // - `checked_add` returns `None` on overflow
+ // - `self` is non-zero
+ // - the only way to get zero from an addition without overflow is for both
+ // sides to be zero
+ //
+ // So the result cannot be zero.
Some(unsafe { $Ty::new_unchecked(result) })
} else {
None
@@ -386,8 +391,13 @@ macro_rules! nonzero_unsigned_operations {
without modifying the original"]
#[inline]
pub const fn saturating_add(self, other: $Int) -> $Ty {
- // SAFETY: $Int::saturating_add returns $Int::MAX on overflow
- // so the result cannot be zero.
+ // SAFETY:
+ // - `saturating_add` returns `u*::MAX` on overflow, which is non-zero
+ // - `self` is non-zero
+ // - the only way to get zero from an addition without overflow is for both
+ // sides to be zero
+ //
+ // So the result cannot be zero.
unsafe { $Ty::new_unchecked(self.get().saturating_add(other)) }
}
@@ -1000,9 +1010,13 @@ macro_rules! nonzero_unsigned_signed_operations {
#[inline]
pub const fn checked_mul(self, other: $Ty) -> Option<$Ty> {
if let Some(result) = self.get().checked_mul(other.get()) {
- // SAFETY: checked_mul returns None on overflow
- // and `other` is also non-null
- // so the result cannot be zero.
+ // SAFETY:
+ // - `checked_mul` returns `None` on overflow
+ // - `self` and `other` are non-zero
+ // - the only way to get zero from a multiplication without overflow is for one
+ // of the sides to be zero
+ //
+ // So the result cannot be zero.
Some(unsafe { $Ty::new_unchecked(result) })
} else {
None
@@ -1034,9 +1048,14 @@ macro_rules! nonzero_unsigned_signed_operations {
without modifying the original"]
#[inline]
pub const fn saturating_mul(self, other: $Ty) -> $Ty {
- // SAFETY: saturating_mul returns u*::MAX on overflow
- // and `other` is also non-null
- // so the result cannot be zero.
+ // SAFETY:
+ // - `saturating_mul` returns `u*::MAX`/`i*::MAX`/`i*::MIN` on overflow/underflow,
+ // all of which are non-zero
+ // - `self` and `other` are non-zero
+ // - the only way to get zero from a multiplication without overflow is for one
+ // of the sides to be zero
+ //
+ // So the result cannot be zero.
unsafe { $Ty::new_unchecked(self.get().saturating_mul(other.get())) }
}
@@ -1107,8 +1126,13 @@ macro_rules! nonzero_unsigned_signed_operations {
#[inline]
pub const fn checked_pow(self, other: u32) -> Option<$Ty> {
if let Some(result) = self.get().checked_pow(other) {
- // SAFETY: checked_pow returns None on overflow
- // so the result cannot be zero.
+ // SAFETY:
+ // - `checked_pow` returns `None` on overflow/underflow
+ // - `self` is non-zero
+ // - the only way to get zero from an exponentiation without overflow is
+ // for base to be zero
+ //
+ // So the result cannot be zero.
Some(unsafe { $Ty::new_unchecked(result) })
} else {
None
@@ -1149,8 +1173,14 @@ macro_rules! nonzero_unsigned_signed_operations {
without modifying the original"]
#[inline]
pub const fn saturating_pow(self, other: u32) -> $Ty {
- // SAFETY: saturating_pow returns u*::MAX on overflow
- // so the result cannot be zero.
+ // SAFETY:
+ // - `saturating_pow` returns `u*::MAX`/`i*::MAX`/`i*::MIN` on overflow/underflow,
+ // all of which are non-zero
+ // - `self` is non-zero
+ // - the only way to get zero from an exponentiation without overflow is
+ // for base to be zero
+ //
+ // So the result cannot be zero.
unsafe { $Ty::new_unchecked(self.get().saturating_pow(other)) }
}
}