Rollup merge of #62351 - RalfJung:drop-in-place, r=cramertj
remove bogus example from drop_in_place Fixes https://github.com/rust-lang/rust/issues/62313
This commit is contained in:
commit
6363a58e9a
|
@ -100,7 +100,11 @@ pub use unique::Unique;
|
||||||
/// as the compiler doesn't need to prove that it's sound to elide the
|
/// as the compiler doesn't need to prove that it's sound to elide the
|
||||||
/// copy.
|
/// copy.
|
||||||
///
|
///
|
||||||
|
/// Unaligned values cannot be dropped in place, they must be copied to an aligned
|
||||||
|
/// location first using [`ptr::read_unaligned`].
|
||||||
|
///
|
||||||
/// [`ptr::read`]: ../ptr/fn.read.html
|
/// [`ptr::read`]: ../ptr/fn.read.html
|
||||||
|
/// [`ptr::read_unaligned`]: ../ptr/fn.read_unaligned.html
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
///
|
///
|
||||||
|
@ -108,8 +112,7 @@ pub use unique::Unique;
|
||||||
///
|
///
|
||||||
/// * `to_drop` must be [valid] for reads.
|
/// * `to_drop` must be [valid] for reads.
|
||||||
///
|
///
|
||||||
/// * `to_drop` must be properly aligned. See the example below for how to drop
|
/// * `to_drop` must be properly aligned.
|
||||||
/// an unaligned pointer.
|
|
||||||
///
|
///
|
||||||
/// Additionally, if `T` is not [`Copy`], using the pointed-to value after
|
/// Additionally, if `T` is not [`Copy`], using the pointed-to value after
|
||||||
/// calling `drop_in_place` can cause undefined behavior. Note that `*to_drop =
|
/// calling `drop_in_place` can cause undefined behavior. Note that `*to_drop =
|
||||||
|
@ -153,31 +156,6 @@ pub use unique::Unique;
|
||||||
/// assert!(weak.upgrade().is_none());
|
/// assert!(weak.upgrade().is_none());
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// Unaligned values cannot be dropped in place, they must be copied to an aligned
|
|
||||||
/// location first:
|
|
||||||
/// ```
|
|
||||||
/// use std::ptr;
|
|
||||||
/// use std::mem::{self, MaybeUninit};
|
|
||||||
///
|
|
||||||
/// unsafe fn drop_after_copy<T>(to_drop: *mut T) {
|
|
||||||
/// let mut copy: MaybeUninit<T> = MaybeUninit::uninit();
|
|
||||||
/// ptr::copy(to_drop, copy.as_mut_ptr(), 1);
|
|
||||||
/// drop(copy.assume_init());
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// #[repr(packed, C)]
|
|
||||||
/// struct Packed {
|
|
||||||
/// _padding: u8,
|
|
||||||
/// unaligned: Vec<i32>,
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// let mut p = Packed { _padding: 0, unaligned: vec![42] };
|
|
||||||
/// unsafe {
|
|
||||||
/// drop_after_copy(&mut p.unaligned as *mut _);
|
|
||||||
/// mem::forget(p);
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
///
|
|
||||||
/// Notice that the compiler performs this copy automatically when dropping packed structs,
|
/// Notice that the compiler performs this copy automatically when dropping packed structs,
|
||||||
/// i.e., you do not usually have to worry about such issues unless you call `drop_in_place`
|
/// i.e., you do not usually have to worry about such issues unless you call `drop_in_place`
|
||||||
/// manually.
|
/// manually.
|
||||||
|
|
Loading…
Reference in New Issue