Skip to content

Commit 1e9e30d

Browse files
committed
Added impl Rem<NonZeroU{0}> for u{0} which cannot panic
1 parent 3f671bc commit 1e9e30d

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

library/core/src/num/nonzero.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Definitions of integer that is known not to equal zero.
22
33
use crate::fmt;
4-
use crate::ops::{BitOr, BitOrAssign, Div};
4+
use crate::ops::{BitOr, BitOrAssign, Div, Rem};
55
use crate::str::FromStr;
66

77
use super::from_str_radix;
@@ -279,6 +279,18 @@ macro_rules! nonzero_integers_div {
279279
unsafe { crate::intrinsics::unchecked_div(self, other.get()) }
280280
}
281281
}
282+
283+
#[stable(feature = "nonzero_div", since = "1.50.0")]
284+
impl Rem<$Ty> for $Int {
285+
type Output = $Int;
286+
/// This operation satisfies `n % d == n - (n / d) * d`, and cannot panic.
287+
#[inline]
288+
fn rem(self, other: $Ty) -> $Int {
289+
// SAFETY: rem by zero is checked because `other` is a nonzero,
290+
// and MIN/-1 is checked because `self` is an unsigned int.
291+
unsafe { crate::intrinsics::unchecked_rem(self, other.get()) }
292+
}
293+
}
282294
)+
283295
}
284296
}

library/core/tests/nonzero.rs

+8
Original file line numberDiff line numberDiff line change
@@ -320,3 +320,11 @@ fn test_nonzero_uint_div() {
320320
let x: u32 = 42u32 / nz;
321321
assert_eq!(x, 42u32);
322322
}
323+
324+
#[test]
325+
fn test_nonzero_uint_rem() {
326+
let nz = NonZeroU32::new(10).unwrap();
327+
328+
let x: u32 = 42u32 % nz;
329+
assert_eq!(x, 2u32);
330+
}

0 commit comments

Comments
 (0)