Skip to content
Draft
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
16 changes: 9 additions & 7 deletions library/core/src/alloc/layout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -215,9 +215,8 @@ impl Layout {
#[must_use]
#[inline]
pub const fn for_value<T: ?Sized>(t: &T) -> Self {
let (size, alignment) = (size_of_val(t), Alignment::of_val(t));
// SAFETY: see rationale in `new` for why this is using the unsafe variant
unsafe { Layout::from_size_alignment_unchecked(size, alignment) }
// SAFETY: Because `t` is a reference, its metadata is valid for this.
unsafe { Layout::for_value_raw(t) }
}

/// Produces layout describing a record that could be used to
Expand Down Expand Up @@ -250,11 +249,14 @@ impl Layout {
#[unstable(feature = "layout_for_ptr", issue = "69835")]
#[must_use]
#[inline]
pub const unsafe fn for_value_raw<T: ?Sized>(t: *const T) -> Self {
pub const unsafe fn for_value_raw<T: ?Sized>(ptr: *const T) -> Self {
// SAFETY: we pass along the prerequisites of these functions to the caller
let (size, alignment) = unsafe { (mem::size_of_val_raw(t), Alignment::of_val_raw(t)) };
// SAFETY: see rationale in `new` for why this is using the unsafe variant
unsafe { Layout::from_size_alignment_unchecked(size, alignment) }
let (size, align) = unsafe { (mem::size_of_val_raw(ptr), Alignment::of_val_raw(ptr)) };
// SAFETY: the dynamic size is that of a valid rust type, and those always
// meet the rules of `Layout` (just like in `Layout::new`).
// NB: We use a struct literal, instead of the unsafe constructor,
// to avoid the unnecessary UB check that has compile-time impact.
Layout { size, align }
}

/// Creates a `NonNull` that is dangling, but well-aligned for this Layout.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,28 @@ fn drop_bytes(_1: *mut Box<[u8; 1024]>) -> () {
let _4: ();
scope 4 {
scope 5 {
scope 18 (inlined Layout::size) {
scope 17 (inlined Layout::size) {
}
scope 19 (inlined std::ptr::Unique::<[u8; 1024]>::cast::<u8>) {
scope 18 (inlined std::ptr::Unique::<[u8; 1024]>::cast::<u8>) {
let mut _3: std::ptr::NonNull<u8>;
scope 20 (inlined NonNull::<[u8; 1024]>::cast::<u8>) {
scope 21 (inlined NonNull::<[u8; 1024]>::as_ptr) {
scope 19 (inlined NonNull::<[u8; 1024]>::cast::<u8>) {
scope 20 (inlined NonNull::<[u8; 1024]>::as_ptr) {
}
}
}
scope 22 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 23 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
scope 21 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 22 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
}
}
scope 24 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 25 (inlined std::alloc::Global::deallocate_impl) {
scope 26 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 27 (inlined Layout::size) {
scope 23 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 24 (inlined std::alloc::Global::deallocate_impl) {
scope 25 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 26 (inlined Layout::size) {
}
scope 28 (inlined alloc::alloc::dealloc_nonnull) {
scope 29 (inlined Layout::size) {
scope 27 (inlined alloc::alloc::dealloc_nonnull) {
scope 28 (inlined Layout::size) {
}
scope 30 (inlined Layout::alignment) {
scope 29 (inlined Layout::alignment) {
}
}
}
Expand All @@ -44,8 +44,6 @@ fn drop_bytes(_1: *mut Box<[u8; 1024]>) -> () {
}
scope 8 (inlined Layout::for_value_raw::<[u8; 1024]>) {
scope 9 {
scope 17 (inlined #[track_caller] Layout::from_size_alignment_unchecked) {
}
}
scope 10 (inlined size_of_val_raw::<[u8; 1024]>) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,28 @@ fn drop_bytes(_1: *mut Box<[u8; 1024]>) -> () {
let _4: ();
scope 4 {
scope 5 {
scope 18 (inlined Layout::size) {
scope 17 (inlined Layout::size) {
}
scope 19 (inlined std::ptr::Unique::<[u8; 1024]>::cast::<u8>) {
scope 18 (inlined std::ptr::Unique::<[u8; 1024]>::cast::<u8>) {
let mut _3: std::ptr::NonNull<u8>;
scope 20 (inlined NonNull::<[u8; 1024]>::cast::<u8>) {
scope 21 (inlined NonNull::<[u8; 1024]>::as_ptr) {
scope 19 (inlined NonNull::<[u8; 1024]>::cast::<u8>) {
scope 20 (inlined NonNull::<[u8; 1024]>::as_ptr) {
}
}
}
scope 22 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 23 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
scope 21 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 22 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
}
}
scope 24 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 25 (inlined std::alloc::Global::deallocate_impl) {
scope 26 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 27 (inlined Layout::size) {
scope 23 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 24 (inlined std::alloc::Global::deallocate_impl) {
scope 25 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 26 (inlined Layout::size) {
}
scope 28 (inlined alloc::alloc::dealloc_nonnull) {
scope 29 (inlined Layout::size) {
scope 27 (inlined alloc::alloc::dealloc_nonnull) {
scope 28 (inlined Layout::size) {
}
scope 30 (inlined Layout::alignment) {
scope 29 (inlined Layout::alignment) {
}
}
}
Expand All @@ -44,8 +44,6 @@ fn drop_bytes(_1: *mut Box<[u8; 1024]>) -> () {
}
scope 8 (inlined Layout::for_value_raw::<[u8; 1024]>) {
scope 9 {
scope 17 (inlined #[track_caller] Layout::from_size_alignment_unchecked) {
}
}
scope 10 (inlined size_of_val_raw::<[u8; 1024]>) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,28 @@ fn drop_generic(_1: *mut Box<T>) -> () {
let _5: ();
scope 4 {
scope 5 {
scope 18 (inlined Layout::size) {
scope 17 (inlined Layout::size) {
}
scope 19 (inlined std::ptr::Unique::<T>::cast::<u8>) {
scope 18 (inlined std::ptr::Unique::<T>::cast::<u8>) {
let mut _4: std::ptr::NonNull<u8>;
scope 20 (inlined NonNull::<T>::cast::<u8>) {
scope 21 (inlined NonNull::<T>::as_ptr) {
scope 19 (inlined NonNull::<T>::cast::<u8>) {
scope 20 (inlined NonNull::<T>::as_ptr) {
}
}
}
scope 22 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 23 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
scope 21 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 22 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
}
}
scope 24 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 25 (inlined std::alloc::Global::deallocate_impl) {
scope 26 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 27 (inlined Layout::size) {
scope 23 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 24 (inlined std::alloc::Global::deallocate_impl) {
scope 25 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 26 (inlined Layout::size) {
}
scope 28 (inlined alloc::alloc::dealloc_nonnull) {
scope 29 (inlined Layout::size) {
scope 27 (inlined alloc::alloc::dealloc_nonnull) {
scope 28 (inlined Layout::size) {
}
scope 30 (inlined Layout::alignment) {
scope 29 (inlined Layout::alignment) {
}
}
}
Expand All @@ -45,8 +45,6 @@ fn drop_generic(_1: *mut Box<T>) -> () {
scope 8 (inlined Layout::for_value_raw::<T>) {
let mut _3: std::mem::Alignment;
scope 9 {
scope 17 (inlined #[track_caller] Layout::from_size_alignment_unchecked) {
}
}
scope 10 (inlined size_of_val_raw::<T>) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,28 @@ fn drop_generic(_1: *mut Box<T>) -> () {
let _5: ();
scope 4 {
scope 5 {
scope 18 (inlined Layout::size) {
scope 17 (inlined Layout::size) {
}
scope 19 (inlined std::ptr::Unique::<T>::cast::<u8>) {
scope 18 (inlined std::ptr::Unique::<T>::cast::<u8>) {
let mut _4: std::ptr::NonNull<u8>;
scope 20 (inlined NonNull::<T>::cast::<u8>) {
scope 21 (inlined NonNull::<T>::as_ptr) {
scope 19 (inlined NonNull::<T>::cast::<u8>) {
scope 20 (inlined NonNull::<T>::as_ptr) {
}
}
}
scope 22 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 23 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
scope 21 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 22 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
}
}
scope 24 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 25 (inlined std::alloc::Global::deallocate_impl) {
scope 26 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 27 (inlined Layout::size) {
scope 23 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 24 (inlined std::alloc::Global::deallocate_impl) {
scope 25 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 26 (inlined Layout::size) {
}
scope 28 (inlined alloc::alloc::dealloc_nonnull) {
scope 29 (inlined Layout::size) {
scope 27 (inlined alloc::alloc::dealloc_nonnull) {
scope 28 (inlined Layout::size) {
}
scope 30 (inlined Layout::alignment) {
scope 29 (inlined Layout::alignment) {
}
}
}
Expand All @@ -45,8 +45,6 @@ fn drop_generic(_1: *mut Box<T>) -> () {
scope 8 (inlined Layout::for_value_raw::<T>) {
let mut _3: std::mem::Alignment;
scope 9 {
scope 17 (inlined #[track_caller] Layout::from_size_alignment_unchecked) {
}
}
scope 10 (inlined size_of_val_raw::<T>) {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,29 +12,29 @@ fn generic_in_place(_1: *mut Box<[T]>) -> () {
let _9: ();
scope 4 {
scope 5 {
scope 18 (inlined Layout::size) {
scope 17 (inlined Layout::size) {
}
scope 19 (inlined std::ptr::Unique::<[T]>::cast::<u8>) {
scope 18 (inlined std::ptr::Unique::<[T]>::cast::<u8>) {
let mut _8: std::ptr::NonNull<u8>;
scope 20 (inlined NonNull::<[T]>::cast::<u8>) {
scope 19 (inlined NonNull::<[T]>::cast::<u8>) {
let mut _7: *mut u8;
scope 21 (inlined NonNull::<[T]>::as_ptr) {
scope 20 (inlined NonNull::<[T]>::as_ptr) {
}
}
}
scope 22 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 23 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
scope 21 (inlined <NonNull<u8> as From<std::ptr::Unique<u8>>>::from) {
scope 22 (inlined std::ptr::Unique::<u8>::as_non_null_ptr) {
}
}
scope 24 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 25 (inlined std::alloc::Global::deallocate_impl) {
scope 26 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 27 (inlined Layout::size) {
scope 23 (inlined <std::alloc::Global as Allocator>::deallocate) {
scope 24 (inlined std::alloc::Global::deallocate_impl) {
scope 25 (inlined std::alloc::Global::deallocate_impl_runtime) {
scope 26 (inlined Layout::size) {
}
scope 28 (inlined alloc::alloc::dealloc_nonnull) {
scope 29 (inlined Layout::size) {
scope 27 (inlined alloc::alloc::dealloc_nonnull) {
scope 28 (inlined Layout::size) {
}
scope 30 (inlined Layout::alignment) {
scope 29 (inlined Layout::alignment) {
}
}
}
Expand All @@ -49,8 +49,6 @@ fn generic_in_place(_1: *mut Box<[T]>) -> () {
let mut _5: usize;
let mut _6: std::mem::Alignment;
scope 9 {
scope 17 (inlined #[track_caller] Layout::from_size_alignment_unchecked) {
}
}
scope 10 (inlined size_of_val_raw::<[T]>) {
}
Expand Down
Loading
Loading