Skip to content

Commit 037d8e7

Browse files
committed
Auto merge of #74488 - CAD97:layout_for_value_raw, r=hanna-kruppe
re-add Layout::for_value_raw Tracking issue: #69835 This was accidentally removed in #70362 56cbf2f. Originally added in #69079.
2 parents 73ca84d + 1821e3d commit 037d8e7

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

src/libcore/alloc/layout.rs

+36-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,42 @@ impl Layout {
131131
pub fn for_value<T: ?Sized>(t: &T) -> Self {
132132
let (size, align) = (mem::size_of_val(t), mem::align_of_val(t));
133133
debug_assert!(Layout::from_size_align(size, align).is_ok());
134-
// SAFETY: see rationale in `new` for why this is using an unsafe variant below
134+
// SAFETY: see rationale in `new` for why this is using the unsafe variant
135+
unsafe { Layout::from_size_align_unchecked(size, align) }
136+
}
137+
138+
/// Produces layout describing a record that could be used to
139+
/// allocate backing structure for `T` (which could be a trait
140+
/// or other unsized type like a slice).
141+
///
142+
/// # Safety
143+
///
144+
/// This function is only safe to call if the following conditions hold:
145+
///
146+
/// - If `T` is `Sized`, this function is always safe to call.
147+
/// - If the unsized tail of `T` is:
148+
/// - a [slice], then the length of the slice tail must be an intialized
149+
/// integer, and the size of the *entire value*
150+
/// (dynamic tail length + statically sized prefix) must fit in `isize`.
151+
/// - a [trait object], then the vtable part of the pointer must point
152+
/// to a valid vtable for the type `T` acquired by an unsizing coersion,
153+
/// and the size of the *entire value*
154+
/// (dynamic tail length + statically sized prefix) must fit in `isize`.
155+
/// - an (unstable) [extern type], then this function is always safe to
156+
/// call, but may panic or otherwise return the wrong value, as the
157+
/// extern type's layout is not known. This is the same behavior as
158+
/// [`Layout::for_value`] on a reference to an extern type tail.
159+
/// - otherwise, it is conservatively not allowed to call this function.
160+
///
161+
/// [slice]: ../../std/primitive.slice.html
162+
/// [trait object]: ../../book/ch17-02-trait-objects.html
163+
/// [extern type]: ../../unstable-book/language-features/extern-types.html
164+
#[unstable(feature = "layout_for_ptr", issue = "69835")]
165+
pub unsafe fn for_value_raw<T: ?Sized>(t: *const T) -> Self {
166+
// SAFETY: we pass along the prerequisites of these functions to the caller
167+
let (size, align) = unsafe { (mem::size_of_val_raw(t), mem::align_of_val_raw(t)) };
168+
debug_assert!(Layout::from_size_align(size, align).is_ok());
169+
// SAFETY: see rationale in `new` for why this is using the unsafe variant
135170
unsafe { Layout::from_size_align_unchecked(size, align) }
136171
}
137172

0 commit comments

Comments
 (0)