From 5785a904b553004856bc91a28331d648dac63e1d Mon Sep 17 00:00:00 2001 From: Jules Bertholet Date: Sun, 14 Sep 2025 11:38:39 -0400 Subject: [PATCH 1/2] Add some conversion trait impls - `impl AsRef for AsciiChar` (unstable) - `impl AsMut for AsciiChar` (unstable) - `impl From<[MaybeUninit; N]> for MaybeUninit<[T; N]>` - `impl AsRef<[MaybeUninit; N]> for MaybeUninit<[T; N]>` - `impl AsRef<[MaybeUninit]> for MaybeUninit<[T; N]>` - `impl AsMut<[MaybeUninit; N]> for MaybeUninit<[T; N]>` - `impl AsMut<[MaybeUninit]> for MaybeUninit<[T; N]>` - `impl From> for [MaybeUninit; N]` - `impl AsRef<[Cell; N]> for Cell<[T; N]>` - `impl AsRef<[Cell]> for Cell<[T; N]>` - `impl AsRef<[Cell]> for Cell<[T]>` --- library/core/src/ascii/ascii_char.rs | 20 ++++++++ library/core/src/cell.rs | 24 +++++++++ library/core/src/mem/maybe_uninit.rs | 50 +++++++++++++++++++ .../issue-71394-no-from-impl.stderr | 2 +- 4 files changed, 95 insertions(+), 1 deletion(-) diff --git a/library/core/src/ascii/ascii_char.rs b/library/core/src/ascii/ascii_char.rs index 178af2c0e3b46..08debadbe6922 100644 --- a/library/core/src/ascii/ascii_char.rs +++ b/library/core/src/ascii/ascii_char.rs @@ -1170,6 +1170,26 @@ macro_rules! into_int_impl { into_int_impl!(u8 u16 u32 u64 u128 char); +#[unstable(feature = "ascii_char", issue = "110998")] +impl AsRef for AsciiChar { + #[inline(always)] + fn as_ref(&self) -> &str { + self.as_str() + } +} + +#[unstable(feature = "ascii_char", issue = "110998")] +impl AsMut for AsciiChar { + #[inline(always)] + fn as_mut(&mut self) -> &mut str { + let ascii_ptr: *mut [Self] = crate::slice::from_mut(self); + let str_ptr = ascii_ptr as *mut str; + // SAFETY: Each ASCII codepoint in UTF-8 is encoded as one single-byte + // code unit having the same value as the ASCII byte. + unsafe { &mut *str_ptr } + } +} + impl [AsciiChar] { /// Views this slice of ASCII characters as a UTF-8 `str`. #[unstable(feature = "ascii_char", issue = "110998")] diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 9b53b75ebee80..b0d318be4a07c 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -671,6 +671,30 @@ impl, U> CoerceUnsized> for Cell {} #[unstable(feature = "dispatch_from_dyn", issue = "none")] impl, U> DispatchFromDyn> for Cell {} +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl AsRef<[Cell; N]> for Cell<[T; N]> { + #[inline(always)] + fn as_ref(&self) -> &[Cell; N] { + self.as_array_of_cells() + } +} + +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl AsRef<[Cell]> for Cell<[T; N]> { + #[inline(always)] + fn as_ref(&self) -> &[Cell] { + &*self.as_array_of_cells() + } +} + +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl AsRef<[Cell]> for Cell<[T]> { + #[inline(always)] + fn as_ref(&self) -> &[Cell] { + self.as_slice_of_cells() + } +} + impl Cell<[T]> { /// Returns a `&[Cell]` from a `&Cell<[T]>` /// diff --git a/library/core/src/mem/maybe_uninit.rs b/library/core/src/mem/maybe_uninit.rs index c160360cfacf9..574326ecce2e1 100644 --- a/library/core/src/mem/maybe_uninit.rs +++ b/library/core/src/mem/maybe_uninit.rs @@ -1452,6 +1452,56 @@ impl MaybeUninit<[T; N]> { } } +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl From<[MaybeUninit; N]> for MaybeUninit<[T; N]> { + #[inline(always)] + fn from(arr: [MaybeUninit; N]) -> Self { + arr.transpose() + } +} + +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl AsRef<[MaybeUninit; N]> for MaybeUninit<[T; N]> { + #[inline(always)] + fn as_ref(&self) -> &[MaybeUninit; N] { + // SAFETY: T and MaybeUninit have the same layout + unsafe { &*(self as *const MaybeUninit<[T; N]> as *const [MaybeUninit; N]) } + } +} + +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl AsRef<[MaybeUninit]> for MaybeUninit<[T; N]> { + #[inline(always)] + fn as_ref(&self) -> &[MaybeUninit] { + &*AsRef::<[MaybeUninit; N]>::as_ref(self) + } +} + +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl AsMut<[MaybeUninit; N]> for MaybeUninit<[T; N]> { + #[inline(always)] + fn as_mut(&mut self) -> &mut [MaybeUninit; N] { + // SAFETY: T and MaybeUninit have the same layout + unsafe { &mut *(self as *mut MaybeUninit<[T; N]> as *mut [MaybeUninit; N]) } + } +} + +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl AsMut<[MaybeUninit]> for MaybeUninit<[T; N]> { + #[inline(always)] + fn as_mut(&mut self) -> &mut [MaybeUninit] { + &mut *AsMut::<[MaybeUninit; N]>::as_mut(self) + } +} + +#[stable(feature = "more_conversion_trait_impls", since = "CURRENT_RUSTC_VERSION")] +impl From> for [MaybeUninit; N] { + #[inline(always)] + fn from(arr: MaybeUninit<[T; N]>) -> Self { + arr.transpose() + } +} + impl [MaybeUninit; N] { /// Transposes a `[MaybeUninit; N]` into a `MaybeUninit<[T; N]>`. /// diff --git a/tests/ui/suggestions/issue-71394-no-from-impl.stderr b/tests/ui/suggestions/issue-71394-no-from-impl.stderr index 9e068c311ae05..b8a240f7f07c5 100644 --- a/tests/ui/suggestions/issue-71394-no-from-impl.stderr +++ b/tests/ui/suggestions/issue-71394-no-from-impl.stderr @@ -13,7 +13,7 @@ LL | let _: &[i8] = data.into(); `[T; 6]` implements `From<(T, T, T, T, T, T)>` `[T; 7]` implements `From<(T, T, T, T, T, T, T)>` `[T; 8]` implements `From<(T, T, T, T, T, T, T, T)>` - and 6 others + and 7 others = note: required for `&[u8]` to implement `Into<&[i8]>` error: aborting due to 1 previous error From 30a32eb015b755738831352fe934ca6261ba0c58 Mon Sep 17 00:00:00 2001 From: Jules Bertholet Date: Wed, 1 Oct 2025 11:12:17 -0400 Subject: [PATCH 2/2] Remove `AsciiChar` impls --- library/core/src/ascii/ascii_char.rs | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/library/core/src/ascii/ascii_char.rs b/library/core/src/ascii/ascii_char.rs index 08debadbe6922..178af2c0e3b46 100644 --- a/library/core/src/ascii/ascii_char.rs +++ b/library/core/src/ascii/ascii_char.rs @@ -1170,26 +1170,6 @@ macro_rules! into_int_impl { into_int_impl!(u8 u16 u32 u64 u128 char); -#[unstable(feature = "ascii_char", issue = "110998")] -impl AsRef for AsciiChar { - #[inline(always)] - fn as_ref(&self) -> &str { - self.as_str() - } -} - -#[unstable(feature = "ascii_char", issue = "110998")] -impl AsMut for AsciiChar { - #[inline(always)] - fn as_mut(&mut self) -> &mut str { - let ascii_ptr: *mut [Self] = crate::slice::from_mut(self); - let str_ptr = ascii_ptr as *mut str; - // SAFETY: Each ASCII codepoint in UTF-8 is encoded as one single-byte - // code unit having the same value as the ASCII byte. - unsafe { &mut *str_ptr } - } -} - impl [AsciiChar] { /// Views this slice of ASCII characters as a UTF-8 `str`. #[unstable(feature = "ascii_char", issue = "110998")]