Rollup merge of #90077 - woppopo:const_nonzero_from, r=oli-obk

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
This commit is contained in:
Yuki Okushi 2021-10-21 14:11:10 +09:00 committed by GitHub
commit e4cfaa1a7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 13 additions and 8 deletions

View File

@ -390,7 +390,8 @@ 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]
@ -398,7 +399,7 @@ macro_rules! nzint_impl_from {
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()))
}
}
}

View File

@ -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)]

View File

@ -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]

View File

@ -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]

View File

@ -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);
@ -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]