diff --git a/src/libcore/num/mod.rs b/src/libcore/num/mod.rs index 39c7d6d24ed04..cb7f83f9fa0d3 100644 --- a/src/libcore/num/mod.rs +++ b/src/libcore/num/mod.rs @@ -4,7 +4,7 @@ #![stable(feature = "rust1", since = "1.0.0")] -use crate::convert::Infallible; +use crate::convert::{Infallible, TryFrom}; use crate::fmt; use crate::intrinsics; use crate::mem; @@ -100,6 +100,20 @@ assert_eq!(size_of::>(), size_of::<", s } } + #[stable(feature = "try_from_nonzero", since = "1.43.0")] + impl TryFrom<$Int> for $Ty { + type Error = (); + doc_comment! { + concat!( +"Converts a `", stringify!($Int), "` into an `", stringify!($Ty), +"` if it is non-zero"), + fn try_from(int: $Int) -> Result { + Self::new(int).ok_or(()) + } + } + + } + impl_nonzero_fmt! { #[$stability] (Debug, Display, Binary, Octal, LowerHex, UpperHex) for $Ty } diff --git a/src/test/ui/numeric/numeric-cast-3.rs b/src/test/ui/numeric/numeric-cast-3.rs new file mode 100644 index 0000000000000..28e30574014da --- /dev/null +++ b/src/test/ui/numeric/numeric-cast-3.rs @@ -0,0 +1,10 @@ +// make sure that TryInto is implemented for NonZero{integer} +// +// check-pass +use std::num::NonZeroUsize; +use std::convert::TryInto; + +fn main() { + let a: NonZeroUsize = 1_usize.try_into().unwrap(); + let b: NonZeroUsize = 0_usize.try_into().unwrap(); +}