From eefd790d3b84d051f124222b9948d4a29fb0decf Mon Sep 17 00:00:00 2001 From: Albin Hedman Date: Sun, 27 Dec 2020 19:46:01 +0100 Subject: [PATCH 1/3] impl const From for num --- library/core/src/convert/num.rs | 15 ++++++++++----- library/core/src/lib.rs | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/library/core/src/convert/num.rs b/library/core/src/convert/num.rs index 1d3a12962145e..75ef873abc965 100644 --- a/library/core/src/convert/num.rs +++ b/library/core/src/convert/num.rs @@ -45,7 +45,8 @@ impl_float_to_int!(f64 => u8 u16 u32 u64 u128 usize i8 i16 i32 i64 i128 isize); macro_rules! impl_from { ($Small: ty, $Large: ty, #[$attr:meta], $doc: expr) => { #[$attr] - impl From<$Small> for $Large { + #[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] + impl const From<$Small> for $Large { // Rustdocs on the impl block show a "[+] show undocumented items" toggle. // Rustdocs on functions do not. #[doc = $doc] @@ -172,7 +173,8 @@ impl_from! { f32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0" macro_rules! try_from_unbounded { ($source:ty, $($target:ty),*) => {$( #[stable(feature = "try_from", since = "1.34.0")] - impl TryFrom<$source> for $target { + #[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] + impl const TryFrom<$source> for $target { type Error = TryFromIntError; /// Try to create the target number type from a source @@ -190,7 +192,8 @@ macro_rules! try_from_unbounded { macro_rules! try_from_lower_bounded { ($source:ty, $($target:ty),*) => {$( #[stable(feature = "try_from", since = "1.34.0")] - impl TryFrom<$source> for $target { + #[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] + impl const TryFrom<$source> for $target { type Error = TryFromIntError; /// Try to create the target number type from a source @@ -212,7 +215,8 @@ macro_rules! try_from_lower_bounded { macro_rules! try_from_upper_bounded { ($source:ty, $($target:ty),*) => {$( #[stable(feature = "try_from", since = "1.34.0")] - impl TryFrom<$source> for $target { + #[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] + impl const TryFrom<$source> for $target { type Error = TryFromIntError; /// Try to create the target number type from a source @@ -234,7 +238,8 @@ macro_rules! try_from_upper_bounded { macro_rules! try_from_both_bounded { ($source:ty, $($target:ty),*) => {$( #[stable(feature = "try_from", since = "1.34.0")] - impl TryFrom<$source> for $target { + #[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")] + impl const TryFrom<$source> for $target { type Error = TryFromIntError; /// Try to create the target number type from a source diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index 222ef34b6aa8a..37c3f8d4c16ab 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -99,6 +99,7 @@ #![feature(const_slice_from_raw_parts)] #![feature(const_slice_ptr_len)] #![feature(const_swap)] +#![feature(const_trait_impl)] #![feature(const_type_id)] #![feature(const_type_name)] #![feature(const_unreachable_unchecked)] From 09928a9a20ceefae6f82dbbe3b526f2227add1e9 Mon Sep 17 00:00:00 2001 From: Albin Hedman Date: Sat, 13 Mar 2021 18:40:47 +0100 Subject: [PATCH 2/3] Add tests --- library/core/tests/lib.rs | 2 ++ library/core/tests/num/const_from.rs | 21 +++++++++++++++++++++ library/core/tests/num/mod.rs | 2 ++ 3 files changed, 25 insertions(+) create mode 100644 library/core/tests/num/const_from.rs diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs index c7756a503c3e9..89eaa34a6717c 100644 --- a/library/core/tests/lib.rs +++ b/library/core/tests/lib.rs @@ -13,6 +13,8 @@ #![feature(const_ptr_read)] #![feature(const_ptr_write)] #![feature(const_ptr_offset)] +#![feature(const_trait_impl)] +#![feature(const_num_from_num)] #![feature(core_intrinsics)] #![feature(core_private_bignum)] #![feature(core_private_diy_float)] diff --git a/library/core/tests/num/const_from.rs b/library/core/tests/num/const_from.rs new file mode 100644 index 0000000000000..7c6de92e48026 --- /dev/null +++ b/library/core/tests/num/const_from.rs @@ -0,0 +1,21 @@ +#[test] +fn from() { + use core::convert::TryFrom; + use core::num::TryFromIntError; + + // From + const FROM: i64 = i64::from(1i32); + assert_eq!(FROM, 1i64); + + // Upper bounded + const U8_FROM_U16: Result = u8::try_from(1u16); + assert_eq!(U8_FROM_U16, Ok(1u8)); + + // Both bounded + const I8_FROM_I16: Result = i8::try_from(1i16); + assert_eq!(I8_FROM_I16, Ok(1i8)); + + // Lower bounded + const I16_FROM_U16: Result = i16::try_from(1u16); + assert_eq!(I16_FROM_U16, Ok(1i16)); +} diff --git a/library/core/tests/num/mod.rs b/library/core/tests/num/mod.rs index 76e838cf6bfbd..37b5e9127d5b0 100644 --- a/library/core/tests/num/mod.rs +++ b/library/core/tests/num/mod.rs @@ -27,6 +27,8 @@ mod u64; mod u8; mod bignum; + +mod const_from; mod dec2flt; mod flt2dec; mod int_log; From c8bf5ed628c5007bd7c88a2265698d3117cbdc72 Mon Sep 17 00:00:00 2001 From: Albin Hedman Date: Sat, 7 Aug 2021 18:59:07 +0200 Subject: [PATCH 3/3] Add test for int to float --- library/core/tests/num/const_from.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/library/core/tests/num/const_from.rs b/library/core/tests/num/const_from.rs index 7c6de92e48026..aca18ef39de1a 100644 --- a/library/core/tests/num/const_from.rs +++ b/library/core/tests/num/const_from.rs @@ -7,6 +7,10 @@ fn from() { const FROM: i64 = i64::from(1i32); assert_eq!(FROM, 1i64); + // From int to float + const FROM_F64: f64 = f64::from(42u8); + assert_eq!(FROM_F64, 42f64); + // Upper bounded const U8_FROM_U16: Result = u8::try_from(1u16); assert_eq!(U8_FROM_U16, Ok(1u8));