Skip to content

Commit

Permalink
Rollup merge of #90077 - woppopo:const_nonzero_from, r=oli-obk
Browse files Browse the repository at this point in the history
Make `From` impls of NonZero integer const.

I also changed the feature gate added to `From` impls of Atomic integer to `const_num_from_num` from `const_convert`.

Tracking issue: #87852
  • Loading branch information
JohnTitor committed Oct 21, 2021
2 parents 371fd4f + 2fc7806 commit e4cfaa1
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 8 deletions.
5 changes: 3 additions & 2 deletions library/core/src/convert/num.rs
Expand Up @@ -390,15 +390,16 @@ use crate::num::NonZeroUsize;
macro_rules! nzint_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]
#[inline]
fn from(small: $Small) -> Self {
// SAFETY: input type guarantees the value is non-zero
unsafe {
Self::new_unchecked(small.get().into())
Self::new_unchecked(From::from(small.get()))
}
}
}
Expand Down
1 change: 1 addition & 0 deletions library/core/src/lib.rs
Expand Up @@ -115,6 +115,7 @@
#![feature(const_likely)]
#![feature(const_maybe_uninit_as_ptr)]
#![feature(const_maybe_uninit_assume_init)]
#![feature(const_num_from_num)]
#![feature(const_option)]
#![feature(const_pin)]
#![feature(const_replace)]
Expand Down
2 changes: 1 addition & 1 deletion library/core/src/num/nonzero.rs
Expand Up @@ -82,7 +82,7 @@ macro_rules! nonzero_integers {
}

#[stable(feature = "from_nonzero", since = "1.31.0")]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")]
impl const From<$Ty> for $Int {
#[doc = concat!("Converts a `", stringify!($Ty), "` into an `", stringify!($Int), "`")]
#[inline]
Expand Down
2 changes: 1 addition & 1 deletion library/core/src/sync/atomic.rs
Expand Up @@ -1365,7 +1365,7 @@ macro_rules! atomic_int {
}

#[$stable_from]
#[rustc_const_unstable(feature = "const_convert", issue = "88674")]
#[rustc_const_unstable(feature = "const_num_from_num", issue = "87852")]
impl const From<$int_type> for $atomic_type {
#[doc = concat!("Converts an `", stringify!($int_type), "` into an `", stringify!($atomic_type), "`.")]
#[inline]
Expand Down
11 changes: 7 additions & 4 deletions library/core/tests/nonzero.rs
Expand Up @@ -204,9 +204,9 @@ fn nonzero_const() {
// test that the methods of `NonZeroX>` are usable in a const context
// Note: only tests NonZero8

const NONZERO: NonZeroU8 = unsafe { NonZeroU8::new_unchecked(5) };
const NONZERO_U8: NonZeroU8 = unsafe { NonZeroU8::new_unchecked(5) };

const GET: u8 = NONZERO.get();
const GET: u8 = NONZERO_U8.get();
assert_eq!(GET, 5);

const ZERO: Option<NonZeroU8> = NonZeroU8::new(0);
Expand All @@ -215,8 +215,11 @@ fn nonzero_const() {
const ONE: Option<NonZeroU8> = NonZeroU8::new(1);
assert!(ONE.is_some());

const FROM_NONZERO: u8 = u8::from(NONZERO);
assert_eq!(FROM_NONZERO, 5);
const FROM_NONZERO_U8: u8 = u8::from(NONZERO_U8);
assert_eq!(FROM_NONZERO_U8, 5);

const NONZERO_CONVERT: NonZeroU32 = NonZeroU32::from(NONZERO_U8);
assert_eq!(NONZERO_CONVERT.get(), 5);
}

#[test]
Expand Down

0 comments on commit e4cfaa1

Please sign in to comment.