Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions library/alloc/src/alloc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -204,12 +204,12 @@ impl Global {
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
fn alloc_impl_runtime(layout: Layout, zeroed: bool) -> Result<NonNull<[u8]>, AllocError> {
match layout.size() {
0 => Ok(NonNull::slice_from_raw_parts(layout.dangling_ptr(), 0)),
0 => Ok(layout.dangling_ptr().cast_slice(0)),
// SAFETY: `layout` is non-zero in size,
size => unsafe {
let raw_ptr = if zeroed { alloc_zeroed(layout) } else { alloc(layout) };
let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?;
Ok(NonNull::slice_from_raw_parts(ptr, size))
Ok(ptr.cast_slice(size))
},
}
}
Expand Down Expand Up @@ -261,7 +261,7 @@ impl Global {
if zeroed {
raw_ptr.add(old_size).write_bytes(0, new_size - old_size);
}
Ok(NonNull::slice_from_raw_parts(ptr, new_size))
Ok(ptr.cast_slice(new_size))
},

// SAFETY: because `new_layout.size()` must be greater than or equal to `old_size`,
Expand Down Expand Up @@ -297,7 +297,7 @@ impl Global {
// SAFETY: conditions must be upheld by the caller
0 => unsafe {
self.deallocate(ptr, old_layout);
Ok(NonNull::slice_from_raw_parts(new_layout.dangling_ptr(), 0))
Ok(new_layout.dangling_ptr().cast_slice(0))
},

// SAFETY: `new_size` is non-zero. Other conditions must be upheld by the caller
Expand All @@ -307,7 +307,7 @@ impl Global {

let raw_ptr = realloc_nonnull(ptr, old_layout, new_size);
let ptr = NonNull::new(raw_ptr).ok_or(AllocError)?;
Ok(NonNull::slice_from_raw_parts(ptr, new_size))
Ok(ptr.cast_slice(new_size))
},

// SAFETY: because `new_size` must be smaller than or equal to `old_layout.size()`,
Expand Down Expand Up @@ -388,7 +388,7 @@ impl Global {
#[rustc_const_unstable(feature = "const_heap", issue = "79597")]
const fn alloc_impl_const(layout: Layout, zeroed: bool) -> Result<NonNull<[u8]>, AllocError> {
match layout.size() {
0 => Ok(NonNull::slice_from_raw_parts(layout.dangling_ptr(), 0)),
0 => Ok(layout.dangling_ptr().cast_slice(0)),
// SAFETY: `layout` is non-zero in size,
size => unsafe {
let raw_ptr = core::intrinsics::const_allocate(layout.size(), layout.align());
Expand All @@ -397,7 +397,7 @@ impl Global {
// SAFETY: the pointer returned by `const_allocate` is valid to write to.
ptr.write_bytes(0, size);
}
Ok(NonNull::slice_from_raw_parts(ptr, size))
Ok(ptr.cast_slice(size))
},
}
}
Expand Down
4 changes: 1 addition & 3 deletions library/alloc/src/collections/vec_deque/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,9 +226,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
/// `range` must lie inside `0..self.capacity()`.
#[inline]
unsafe fn buffer_range(&self, range: Range<usize>) -> *mut [T] {
unsafe {
ptr::slice_from_raw_parts_mut(self.ptr().add(range.start), range.end - range.start)
}
unsafe { self.ptr().add(range.start).cast_slice(range.end - range.start) }
}

/// Returns `true` if the buffer is at full capacity.
Expand Down
1 change: 1 addition & 0 deletions library/alloc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
#![feature(pattern)]
#![feature(pin_coerce_unsized_trait)]
#![feature(ptr_alignment_type)]
#![feature(ptr_cast_slice)]
#![feature(ptr_internals)]
#![feature(ptr_metadata)]
#![feature(rev_into_inner)]
Expand Down
2 changes: 1 addition & 1 deletion library/alloc/src/raw_vec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ impl<T, A: Allocator> RawVec<T, A> {

let me = ManuallyDrop::new(self);
unsafe {
let slice = ptr::slice_from_raw_parts_mut(me.ptr() as *mut MaybeUninit<T>, len);
let slice = me.ptr().cast::<MaybeUninit<T>>().cast_slice(len);
Box::from_raw_in(slice, ptr::read(&me.inner.alloc))
}
}
Expand Down
14 changes: 4 additions & 10 deletions library/alloc/src/rc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1160,10 +1160,7 @@ impl<T> Rc<[T]> {
Rc::from_ptr(Rc::allocate_for_layout(
Layout::array::<T>(len).unwrap(),
|layout| Global.allocate_zeroed(layout),
|mem| {
ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len)
as *mut RcInner<[mem::MaybeUninit<T>]>
},
|mem| mem.cast::<T>().cast_slice(len) as *mut RcInner<[mem::MaybeUninit<T>]>,
))
}
}
Expand Down Expand Up @@ -1231,10 +1228,7 @@ impl<T, A: Allocator> Rc<[T], A> {
Rc::allocate_for_layout(
Layout::array::<T>(len).unwrap(),
|layout| alloc.allocate_zeroed(layout),
|mem| {
ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len)
as *mut RcInner<[mem::MaybeUninit<T>]>
},
|mem| mem.cast::<T>().cast_slice(len) as *mut RcInner<[mem::MaybeUninit<T>]>,
),
alloc,
)
Expand Down Expand Up @@ -2325,7 +2319,7 @@ impl<T> Rc<[T]> {
Self::allocate_for_layout(
Layout::array::<T>(len).unwrap(),
|layout| Global.allocate(layout),
|mem| ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len) as *mut RcInner<[T]>,
|mem| mem.cast::<T>().cast_slice(len) as *mut RcInner<[T]>,
)
}
}
Expand Down Expand Up @@ -2402,7 +2396,7 @@ impl<T, A: Allocator> Rc<[T], A> {
Rc::<[T]>::allocate_for_layout(
Layout::array::<T>(len).unwrap(),
|layout| alloc.allocate(layout),
|mem| ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len) as *mut RcInner<[T]>,
|mem| mem.cast::<T>().cast_slice(len) as *mut RcInner<[T]>,
)
}
}
Expand Down
14 changes: 4 additions & 10 deletions library/alloc/src/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1306,10 +1306,7 @@ impl<T> Arc<[T]> {
Arc::from_ptr(Arc::allocate_for_layout(
Layout::array::<T>(len).unwrap(),
|layout| Global.allocate_zeroed(layout),
|mem| {
ptr::slice_from_raw_parts_mut(mem as *mut T, len)
as *mut ArcInner<[mem::MaybeUninit<T>]>
},
|mem| mem.cast::<T>().cast_slice(len) as *mut ArcInner<[mem::MaybeUninit<T>]>,
))
}
}
Expand Down Expand Up @@ -1378,10 +1375,7 @@ impl<T, A: Allocator> Arc<[T], A> {
Arc::allocate_for_layout(
Layout::array::<T>(len).unwrap(),
|layout| alloc.allocate_zeroed(layout),
|mem| {
ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len)
as *mut ArcInner<[mem::MaybeUninit<T>]>
},
|mem| mem.cast::<T>().cast_slice(len) as *mut ArcInner<[mem::MaybeUninit<T>]>,
),
alloc,
)
Expand Down Expand Up @@ -2270,7 +2264,7 @@ impl<T> Arc<[T]> {
Self::allocate_for_layout(
Layout::array::<T>(len).unwrap(),
|layout| Global.allocate(layout),
|mem| ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len) as *mut ArcInner<[T]>,
|mem| mem.cast::<T>().cast_slice(len) as *mut ArcInner<[T]>,
)
}
}
Expand Down Expand Up @@ -2349,7 +2343,7 @@ impl<T, A: Allocator> Arc<[T], A> {
Arc::allocate_for_layout(
Layout::array::<T>(len).unwrap(),
|layout| alloc.allocate(layout),
|mem| ptr::slice_from_raw_parts_mut(mem.cast::<T>(), len) as *mut ArcInner<[T]>,
|mem| mem.cast::<T>().cast_slice(len) as *mut ArcInner<[T]>,
)
}
}
Expand Down
2 changes: 1 addition & 1 deletion library/alloc/src/vec/drain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ impl<T, A: Allocator> Drop for Drain<'_, T, A> {
// invalidate raw pointers to it which some unsafe code might rely on.
let vec_ptr = vec.as_mut().as_mut_ptr();
let drop_offset = drop_ptr.offset_from_unsigned(vec_ptr);
let to_drop = ptr::slice_from_raw_parts_mut(vec_ptr.add(drop_offset), drop_len);
let to_drop = vec_ptr.add(drop_offset).cast_slice(drop_len);
ptr::drop_in_place(to_drop);
}
}
Expand Down
8 changes: 3 additions & 5 deletions library/alloc/src/vec/in_place_drop.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use core::marker::PhantomData;
use core::ptr::{self, NonNull, drop_in_place};
use core::ptr::NonNull;

use crate::alloc::Global;
use crate::raw_vec::RawVec;
Expand All @@ -20,9 +20,7 @@ impl<T> InPlaceDrop<T> {
impl<T> Drop for InPlaceDrop<T> {
#[inline]
fn drop(&mut self) {
unsafe {
ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.inner, self.len()));
}
unsafe { self.inner.cast_slice(self.len()).drop_in_place() }
}
}

Expand All @@ -42,7 +40,7 @@ impl<Src, Dest> Drop for InPlaceDstDataSrcBufDrop<Src, Dest> {
unsafe {
let _drop_allocation =
RawVec::<Src>::from_nonnull_in(self.ptr.cast::<Src>(), self.src_cap, Global);
drop_in_place(core::ptr::slice_from_raw_parts_mut::<Dest>(self.ptr.as_ptr(), self.len));
self.ptr.as_ptr().cast_slice(self.len).drop_in_place();
};
}
}
8 changes: 4 additions & 4 deletions library/alloc/src/vec/into_iter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ impl<T, A: Allocator> IntoIter<T, A> {
}

fn as_raw_mut_slice(&mut self) -> *mut [T] {
ptr::slice_from_raw_parts_mut(self.ptr.as_ptr(), self.len())
self.ptr.as_ptr().cast_slice(self.len())
}

/// Drops remaining elements and relinquishes the backing allocation.
Expand Down Expand Up @@ -282,7 +282,7 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
#[inline]
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
let step_size = self.len().min(n);
let to_drop = ptr::slice_from_raw_parts_mut(self.ptr.as_ptr(), step_size);
let to_drop = self.ptr.as_ptr().cast_slice(step_size);
if T::IS_ZST {
// See `next` for why we sub `end` here.
self.end = self.end.wrapping_byte_sub(step_size);
Expand Down Expand Up @@ -457,9 +457,9 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> {
}
let to_drop = if T::IS_ZST {
// ZST may cause unalignment
ptr::slice_from_raw_parts_mut(ptr::NonNull::<T>::dangling().as_ptr(), step_size)
ptr::NonNull::<T>::dangling().as_ptr().cast_slice(step_size)
} else {
ptr::slice_from_raw_parts_mut(self.end as *mut T, step_size)
self.end.cast::<T>().cast_mut().cast_slice(step_size)
};
// SAFETY: same as for advance_by()
unsafe {
Expand Down
4 changes: 2 additions & 2 deletions library/alloc/src/vec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1802,7 +1802,7 @@ impl<T, A: Allocator> Vec<T, A> {
return;
}
let remaining_len = self.len - len;
let s = ptr::slice_from_raw_parts_mut(self.as_mut_ptr().add(len), remaining_len);
let s = self.as_mut_ptr().add(len).cast_slice(remaining_len);
self.len = len;
ptr::drop_in_place(s);
}
Expand Down Expand Up @@ -4261,7 +4261,7 @@ unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec<T, A> {
// use drop for [T]
// use a raw slice to refer to the elements of the vector as weakest necessary type;
// could avoid questions of validity in certain cases
ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
self.as_mut_ptr().cast_slice(self.len).drop_in_place()
}
// RawVec handles deallocation
}
Expand Down
1 change: 1 addition & 0 deletions library/alloctests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#![feature(iter_next_chunk)]
#![feature(maybe_uninit_uninit_array_transpose)]
#![feature(ptr_alignment_type)]
#![feature(ptr_cast_slice)]
#![feature(ptr_internals)]
#![feature(rev_into_inner)]
#![feature(sized_type_properties)]
Expand Down
2 changes: 1 addition & 1 deletion library/alloctests/tests/arc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ fn eq_unsized() {
fn eq_unsized_slice() {
let a: Arc<[()]> = Arc::new([(); 3]);
let ptr: *const () = Arc::into_raw(a.clone()).cast();
let b: Arc<[()]> = unsafe { Arc::from_raw(core::ptr::slice_from_raw_parts(ptr, 42)) };
let b: Arc<[()]> = unsafe { Arc::from_raw(ptr.cast_slice(42)) };
assert!(a == a);
assert!(!(a != a));
assert!(a != b);
Expand Down
2 changes: 1 addition & 1 deletion library/alloctests/tests/boxed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ pub struct ConstAllocator;
unsafe impl Allocator for ConstAllocator {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
match layout.size() {
0 => Ok(NonNull::slice_from_raw_parts(layout.dangling_ptr(), 0)),
0 => Ok(layout.dangling_ptr().cast_slice(0)),
_ => unsafe {
let ptr = core::intrinsics::const_allocate(layout.size(), layout.align());
Ok(NonNull::new_unchecked(ptr as *mut [u8; 0] as *mut [u8]))
Expand Down
1 change: 1 addition & 0 deletions library/alloctests/tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#![feature(macro_metavar_expr_concat)]
#![feature(vec_peek_mut)]
#![feature(vec_try_remove)]
#![feature(ptr_cast_slice)]
#![allow(internal_features)]
#![deny(fuzzy_provenance_casts)]
#![deny(unsafe_op_in_unsafe_fn)]
Expand Down
2 changes: 1 addition & 1 deletion library/alloctests/tests/rc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ fn eq_unsized() {
fn eq_unsized_slice() {
let a: Rc<[()]> = Rc::new([(); 3]);
let ptr: *const () = Rc::into_raw(a.clone()).cast();
let b: Rc<[()]> = unsafe { Rc::from_raw(core::ptr::slice_from_raw_parts(ptr, 42)) };
let b: Rc<[()]> = unsafe { Rc::from_raw(ptr.cast_slice(42)) };
assert!(a == a);
assert!(!(a != a));
assert!(a != b);
Expand Down
2 changes: 1 addition & 1 deletion library/alloctests/tests/vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2569,7 +2569,7 @@ fn test_box_zero_allocator() {
} else {
unsafe { std::alloc::alloc(layout) }
};
Ok(NonNull::slice_from_raw_parts(NonNull::new(ptr).ok_or(AllocError)?, layout.size()))
Ok(NonNull::new(ptr).ok_or(AllocError)?.cast_slice(layout.size()))
}

unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
Expand Down
6 changes: 2 additions & 4 deletions library/core/src/iter/adapters/map_windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -218,10 +218,8 @@ impl<T, const N: usize> Drop for Buffer<T, N> {
// SAFETY: our invariant guarantees that N elements starting from
// `self.start` are initialized. We drop them here.
unsafe {
let initialized_part: *mut [T] = crate::ptr::slice_from_raw_parts_mut(
self.buffer_mut_ptr().add(self.start).cast(),
N,
);
let initialized_part: *mut [T] =
self.buffer_mut_ptr().add(self.start).cast::<T>().cast_slice(N);
ptr::drop_in_place(initialized_part);
}
}
Expand Down
6 changes: 3 additions & 3 deletions library/core/src/ptr/const_ptr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1400,11 +1400,11 @@ impl<T> *const T {
///
/// ```rust
/// #![feature(ptr_cast_slice)]
///
/// // create a slice pointer when starting out with a pointer to the first element
/// let x = [5, 6, 7];
/// let raw_pointer = x.as_ptr();
/// let slice = raw_pointer.cast_slice(3);
/// assert_eq!(unsafe { &*slice }[2], 7);
/// let raw_slice = x.as_ptr().cast_slice(3);
/// assert_eq!(unsafe { &*raw_slice }[2], 7);
/// ```
///
/// You must ensure that the pointer is valid and not null before dereferencing
Expand Down
7 changes: 4 additions & 3 deletions library/core/src/ptr/mut_ptr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1675,13 +1675,13 @@ impl<T> *mut T {
/// #![feature(ptr_cast_slice)]
///
/// let x = &mut [5, 6, 7];
/// let slice = x.as_mut_ptr().cast_slice(3);
/// let raw_mut_slice = x.as_mut_ptr().cast_slice(3);
///
/// unsafe {
/// (*slice)[2] = 99; // assign a value at an index in the slice
/// (*raw_mut_slice)[2] = 99; // assign a value at an index in the slice
/// };
///
/// assert_eq!(unsafe { &*slice }[2], 99);
/// assert_eq!(unsafe { &*raw_mut_slice }[2], 99);
/// ```
///
/// You must ensure that the pointer is valid and not null before dereferencing
Expand All @@ -1701,6 +1701,7 @@ impl<T> *mut T {
slice_from_raw_parts_mut(self, len)
}
}

impl<T> *mut MaybeUninit<T> {
/// Casts from a maybe-uninitialized type to its initialized version.
///
Expand Down
2 changes: 1 addition & 1 deletion library/core/src/ptr/non_null.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1444,7 +1444,7 @@ impl<T> NonNull<[T]> {
#[inline]
pub const fn slice_from_raw_parts(data: NonNull<T>, len: usize) -> Self {
// SAFETY: `data` is a `NonNull` pointer which is necessarily non-null
unsafe { Self::new_unchecked(super::slice_from_raw_parts_mut(data.as_ptr(), len)) }
unsafe { Self::new_unchecked(data.as_ptr().cast_slice(len)) }
}

/// Returns the length of a non-null raw slice.
Expand Down
Loading