From 155b4c28c11b56bfe94acab0006530694acfcee4 Mon Sep 17 00:00:00 2001 From: Konrad Borowski Date: Sun, 21 Aug 2022 15:05:58 +0000 Subject: [PATCH] Use ptr::metadata in <[T]>::len implementation This avoids duplication of ptr::metadata code. --- library/core/src/ptr/metadata.rs | 14 +++++++------- library/core/src/ptr/mod.rs | 1 - library/core/src/slice/mod.rs | 11 ++--------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/library/core/src/ptr/metadata.rs b/library/core/src/ptr/metadata.rs index 8865c834c88d6..caa10f1818b4d 100644 --- a/library/core/src/ptr/metadata.rs +++ b/library/core/src/ptr/metadata.rs @@ -135,16 +135,16 @@ pub const fn from_raw_parts_mut( } #[repr(C)] -pub(crate) union PtrRepr { - pub(crate) const_ptr: *const T, - pub(crate) mut_ptr: *mut T, - pub(crate) components: PtrComponents, +union PtrRepr { + const_ptr: *const T, + mut_ptr: *mut T, + components: PtrComponents, } #[repr(C)] -pub(crate) struct PtrComponents { - pub(crate) data_address: *const (), - pub(crate) metadata: ::Metadata, +struct PtrComponents { + data_address: *const (), + metadata: ::Metadata, } // Manual impl needed to avoid `T: Copy` bound. diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index 203531f66aa36..4869b6ee23dd1 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -390,7 +390,6 @@ pub use crate::intrinsics::copy; pub use crate::intrinsics::write_bytes; mod metadata; -pub(crate) use metadata::PtrRepr; #[unstable(feature = "ptr_metadata", issue = "81513")] pub use metadata::{from_raw_parts, from_raw_parts_mut, metadata, DynMetadata, Pointee, Thin}; diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs index e79d47c9f98cd..be24f2a1b812d 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -123,18 +123,11 @@ impl [T] { #[lang = "slice_len_fn"] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_const_stable(feature = "const_slice_len", since = "1.39.0")] + #[rustc_allow_const_fn_unstable(ptr_metadata)] #[inline] #[must_use] - // SAFETY: const sound because we transmute out the length field as a usize (which it must be) pub const fn len(&self) -> usize { - // FIXME: Replace with `crate::ptr::metadata(self)` when that is const-stable. - // As of this writing this causes a "Const-stable functions can only call other - // const-stable functions" error. - - // SAFETY: Accessing the value from the `PtrRepr` union is safe since *const T - // and PtrComponents have the same memory layouts. Only std can make this - // guarantee. - unsafe { crate::ptr::PtrRepr { const_ptr: self }.components.metadata } + ptr::metadata(self) } /// Returns `true` if the slice has a length of 0.