Skip to content
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -448,9 +448,22 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
if let Some((msg, span)) = type_def {
err.span_label(span, msg);
}
for note in notes {
// If it has a custom `#[rustc_on_unimplemented]` note, let's display it
err.note(note);
// `#[rustc_on_unimplemented]` notes for derivable traits (e.g. `Debug`'s
// "add `#[derive(Debug)]` to `X` or manually `impl Debug for X`") duplicate
// the `consider annotating X with #[derive(..)]` suggestion that
// `suggest_derive` emits below, so skip them when that suggestion will be
// shown. We keep the note otherwise (e.g. when a field isn't `Debug`, so
// the derive can't be suggested) to avoid leaving the diagnostic without
// actionable guidance.
let derive_suggestion_will_be_shown = main_trait_predicate
== leaf_trait_predicate
&& self.can_suggest_derive(&obligation, leaf_trait_predicate);
if !derive_suggestion_will_be_shown {
for note in notes {
// If it has a custom `#[rustc_on_unimplemented]` note, let's display
// it.
err.note(note);
}
}
if let Some(s) = parent_label {
let body = obligation.cause.body_id;
Expand Down
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
2 changes: 2 additions & 0 deletions library/alloc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
// Lints:
#![deny(unsafe_op_in_unsafe_fn)]
#![deny(fuzzy_provenance_casts)]
#![deny(lossy_provenance_casts)]
#![warn(deprecated_in_future)]
#![warn(missing_debug_implementations)]
#![warn(missing_docs)]
Expand Down Expand Up @@ -140,6 +141,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 @@ -2327,7 +2321,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 @@ -2404,7 +2398,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 @@ -2272,7 +2266,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 @@ -2351,7 +2345,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 @@ -1830,7 +1830,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 @@ -4289,7 +4289,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/benches/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#![feature(strict_provenance_lints)]
#![feature(test)]
#![deny(fuzzy_provenance_casts)]
#![deny(lossy_provenance_casts)]

extern crate test;

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
6 changes: 3 additions & 3 deletions library/alloctests/tests/boxed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,9 @@ fn box_clone_from_ptr_stability() {
for size in (0..8).map(|i| 2usize.pow(i)) {
let control = vec![Dummy { _data: 42 }; size].into_boxed_slice();
let mut copy = vec![Dummy { _data: 84 }; size].into_boxed_slice();
let copy_raw = copy.as_ptr() as usize;
let copy_raw = copy.as_ptr();
copy.clone_from(&control);
assert_eq!(copy.as_ptr() as usize, copy_raw);
assert_eq!(copy.as_ptr(), copy_raw);
}
}

Expand Down 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
2 changes: 1 addition & 1 deletion library/alloctests/tests/heap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ fn check_overalign_requests<T: Allocator>(allocator: T) {
.collect();
for &ptr in &pointers {
assert_eq!(
(ptr.as_non_null_ptr().as_ptr() as usize) % align,
ptr.as_non_null_ptr().as_ptr().addr() % align,
0,
"Got a pointer less aligned than requested"
)
Expand Down
2 changes: 2 additions & 0 deletions library/alloctests/tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,10 @@
#![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(lossy_provenance_casts)]
#![deny(unsafe_op_in_unsafe_fn)]

extern crate alloc;
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/sort/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,7 @@ fn self_cmp<T: Ord + Clone + Debug, S: Sort>(
pattern_fn(len).into_iter().map(|val| type_into_fn(val)).collect::<Vec<_>>();

let comparison_fn = |a: &T, b: &T| {
assert_ne!(a as *const T as usize, b as *const T as usize);
assert_ne!(a as *const T, b as *const T);
a.cmp(b)
};

Expand Down
Loading
Loading