mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Auto merge of #100848 - xfix:use-metadata-for-slice-len, r=thomcc
Use ptr::metadata in <[T]>::len implementation This avoids duplication of ptr::metadata code. I believe this is acceptable as the previous approach essentially duplicated `ptr::metadata` because back then `rustc_allow_const_fn_unstable` annotation did not exist. I would like somebody to ping `@rust-lang/wg-const-eval` as the documentation says: > Always ping `@rust-lang/wg-const-eval` if you are adding more rustc_allow_const_fn_unstable attributes to any const fn.
This commit is contained in:
commit
56f132565e
@ -135,16 +135,16 @@ pub const fn from_raw_parts_mut<T: ?Sized>(
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub(crate) union PtrRepr<T: ?Sized> {
|
||||
pub(crate) const_ptr: *const T,
|
||||
pub(crate) mut_ptr: *mut T,
|
||||
pub(crate) components: PtrComponents<T>,
|
||||
union PtrRepr<T: ?Sized> {
|
||||
const_ptr: *const T,
|
||||
mut_ptr: *mut T,
|
||||
components: PtrComponents<T>,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub(crate) struct PtrComponents<T: ?Sized> {
|
||||
pub(crate) data_address: *const (),
|
||||
pub(crate) metadata: <T as Pointee>::Metadata,
|
||||
struct PtrComponents<T: ?Sized> {
|
||||
data_address: *const (),
|
||||
metadata: <T as Pointee>::Metadata,
|
||||
}
|
||||
|
||||
// Manual impl needed to avoid `T: Copy` bound.
|
||||
|
@ -394,7 +394,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};
|
||||
|
||||
|
@ -123,18 +123,11 @@ impl<T> [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<T> 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.
|
||||
|
Loading…
Reference in New Issue
Block a user