Mark {array,slice}::{from_ref,from_mut} as const fn

This commit is contained in:
Maybe Waffle 2021-10-22 11:15:56 +03:00
parent 1d6f24210c
commit a288bf6afb
3 changed files with 10 additions and 4 deletions

View File

@ -85,14 +85,16 @@ where
/// Converts a reference to `T` into a reference to an array of length 1 (without copying). /// Converts a reference to `T` into a reference to an array of length 1 (without copying).
#[stable(feature = "array_from_ref", since = "1.53.0")] #[stable(feature = "array_from_ref", since = "1.53.0")]
pub fn from_ref<T>(s: &T) -> &[T; 1] { #[rustc_const_unstable(feature = "const_array_from_ref", issue = "none")]
pub const fn from_ref<T>(s: &T) -> &[T; 1] {
// SAFETY: Converting `&T` to `&[T; 1]` is sound. // SAFETY: Converting `&T` to `&[T; 1]` is sound.
unsafe { &*(s as *const T).cast::<[T; 1]>() } unsafe { &*(s as *const T).cast::<[T; 1]>() }
} }
/// Converts a mutable reference to `T` into a mutable reference to an array of length 1 (without copying). /// Converts a mutable reference to `T` into a mutable reference to an array of length 1 (without copying).
#[stable(feature = "array_from_ref", since = "1.53.0")] #[stable(feature = "array_from_ref", since = "1.53.0")]
pub fn from_mut<T>(s: &mut T) -> &mut [T; 1] { #[rustc_const_unstable(feature = "const_array_from_ref", issue = "none")]
pub const fn from_mut<T>(s: &mut T) -> &mut [T; 1] {
// SAFETY: Converting `&mut T` to `&mut [T; 1]` is sound. // SAFETY: Converting `&mut T` to `&mut [T; 1]` is sound.
unsafe { &mut *(s as *mut T).cast::<[T; 1]>() } unsafe { &mut *(s as *mut T).cast::<[T; 1]>() }
} }

View File

@ -135,6 +135,8 @@
#![feature(ptr_metadata)] #![feature(ptr_metadata)]
#![feature(slice_ptr_get)] #![feature(slice_ptr_get)]
#![feature(variant_count)] #![feature(variant_count)]
#![feature(const_array_from_ref)]
#![feature(const_slice_from_ref)]
// //
// Language features: // Language features:
#![feature(abi_unadjusted)] #![feature(abi_unadjusted)]

View File

@ -138,12 +138,14 @@ pub unsafe fn from_raw_parts_mut<'a, T>(data: *mut T, len: usize) -> &'a mut [T]
/// Converts a reference to T into a slice of length 1 (without copying). /// Converts a reference to T into a slice of length 1 (without copying).
#[stable(feature = "from_ref", since = "1.28.0")] #[stable(feature = "from_ref", since = "1.28.0")]
pub fn from_ref<T>(s: &T) -> &[T] { #[rustc_const_unstable(feature = "const_slice_from_ref", issue = "none")]
pub const fn from_ref<T>(s: &T) -> &[T] {
array::from_ref(s) array::from_ref(s)
} }
/// Converts a reference to T into a slice of length 1 (without copying). /// Converts a reference to T into a slice of length 1 (without copying).
#[stable(feature = "from_ref", since = "1.28.0")] #[stable(feature = "from_ref", since = "1.28.0")]
pub fn from_mut<T>(s: &mut T) -> &mut [T] { #[rustc_const_unstable(feature = "const_slice_from_ref", issue = "none")]
pub const fn from_mut<T>(s: &mut T) -> &mut [T] {
array::from_mut(s) array::from_mut(s)
} }