Replace WriteCloneIntoRaw with CloneToUninit. · model-checking/verify-rust-std@5ac719e (original) (raw)

5 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -424,29 +424,3 @@ pub mod __alloc_error_handler {
424 424 }
425 425 }
426 426 }
427 -
428 -#[cfg(not(no_global_oom_handling))]
429 -/// Specialize clones into pre-allocated, uninitialized memory.
430 -/// Used by `Box::clone` and `Rc`/`Arc::make_mut`.
431 -pub(crate) trait WriteCloneIntoRaw: Sized {
432 -unsafe fn write_clone_into_raw(&self, target: *mut Self);
433 -}
434 -
435 -#[cfg(not(no_global_oom_handling))]
436 -impl<T: Clone> WriteCloneIntoRaw for T {
437 -#[inline]
438 -default unsafe fn write_clone_into_raw(&self, target: *mut Self) {
439 -// Having allocated *first* may allow the optimizer to create
440 -// the cloned value in-place, skipping the local and move.
441 -unsafe { target.write(self.clone()) };
442 -}
443 -}
444 -
445 -#[cfg(not(no_global_oom_handling))]
446 -impl<T: Copy> WriteCloneIntoRaw for T {
447 -#[inline]
448 -unsafe fn write_clone_into_raw(&self, target: *mut Self) {
449 -// We can always copy in-place, without ever involving a local value.
450 -unsafe { target.copy_from_nonoverlapping(self, 1) };
451 -}
452 -}
Original file line number Diff line number Diff line change
@@ -188,6 +188,8 @@
188 188 use core::any::Any;
189 189 use core::async_iter::AsyncIterator;
190 190 use core::borrow;
191 +#[cfg(not(no_global_oom_handling))]
192 +use core::clone::CloneToUninit;
191 193 use core::cmp::Ordering;
192 194 use core::error::Error;
193 195 use core::fmt;
@@ -207,7 +209,7 @@ use core::slice;
207 209 use core::task::{Context, Poll};
208 210
209 211 #[cfg(not(no_global_oom_handling))]
210 -use crate::alloc::{handle_alloc_error, WriteCloneIntoRaw};
212 +use crate::alloc::handle_alloc_error;
211 213 use crate::alloc::{AllocError, Allocator, Global, Layout};
212 214 #[cfg(not(no_global_oom_handling))]
213 215 use crate::borrow::Cow;
@@ -1346,7 +1348,7 @@ impl<T: Clone, A: Allocator + Clone> Clone for Box<T, A> {
1346 1348 // Pre-allocate memory to allow writing the cloned value directly.
1347 1349 let mut boxed = Self::new_uninit_in(self.1.clone());
1348 1350 unsafe {
1349 -(**self).write_clone_into_raw(boxed.as_mut_ptr());
1351 +(**self).clone_to_uninit(boxed.as_mut_ptr());
1350 1352 boxed.assume_init()
1351 1353 }
1352 1354 }
Original file line number Diff line number Diff line change
@@ -103,6 +103,7 @@
103 103 #![feature(assert_matches)]
104 104 #![feature(async_fn_traits)]
105 105 #![feature(async_iterator)]
106 +#![feature(clone_to_uninit)]
106 107 #![feature(coerce_unsized)]
107 108 #![feature(const_align_of_val)]
108 109 #![feature(const_box)]
Original file line number Diff line number Diff line change
@@ -249,6 +249,8 @@ use std::boxed::Box;
249 249 use core::any::Any;
250 250 use core::borrow;
251 251 use core::cell::Cell;
252 +#[cfg(not(no_global_oom_handling))]
253 +use core::clone::CloneToUninit;
252 254 use core::cmp::Ordering;
253 255 use core::fmt;
254 256 use core::hash::{Hash, Hasher};
@@ -268,8 +270,6 @@ use core::slice::from_raw_parts_mut;
268 270
269 271 #[cfg(not(no_global_oom_handling))]
270 272 use crate::alloc::handle_alloc_error;
271 -#[cfg(not(no_global_oom_handling))]
272 -use crate::alloc::WriteCloneIntoRaw;
273 273 use crate::alloc::{AllocError, Allocator, Global, Layout};
274 274 use crate::borrow::{Cow, ToOwned};
275 275 #[cfg(not(no_global_oom_handling))]
@@ -1810,7 +1810,7 @@ impl<T: Clone, A: Allocator + Clone> Rc<T, A> {
1810 1810 let mut rc = Self::new_uninit_in(this.alloc.clone());
1811 1811 unsafe {
1812 1812 let data = Rc::get_mut_unchecked(&mut rc);
1813 -(**this).write_clone_into_raw(data.as_mut_ptr());
1813 +(**this).clone_to_uninit(data.as_mut_ptr());
1814 1814 *this = rc.assume_init();
1815 1815 }
1816 1816 } else if Rc::weak_count(this) != 0 {
Original file line number Diff line number Diff line change
@@ -10,6 +10,8 @@
10 10
11 11 use core::any::Any;
12 12 use core::borrow;
13 +#[cfg(not(no_global_oom_handling))]
14 +use core::clone::CloneToUninit;
13 15 use core::cmp::Ordering;
14 16 use core::fmt;
15 17 use core::hash::{Hash, Hasher};
@@ -30,8 +32,6 @@ use core::sync::atomic::Ordering::{Acquire, Relaxed, Release};
30 32
31 33 #[cfg(not(no_global_oom_handling))]
32 34 use crate::alloc::handle_alloc_error;
33 -#[cfg(not(no_global_oom_handling))]
34 -use crate::alloc::WriteCloneIntoRaw;
35 35 use crate::alloc::{AllocError, Allocator, Global, Layout};
36 36 use crate::borrow::{Cow, ToOwned};
37 37 use crate::boxed::Box;
@@ -2219,7 +2219,7 @@ impl<T: Clone, A: Allocator + Clone> Arc<T, A> {
2219 2219 let mut arc = Self::new_uninit_in(this.alloc.clone());
2220 2220 unsafe {
2221 2221 let data = Arc::get_mut_unchecked(&mut arc);
2222 -(**this).write_clone_into_raw(data.as_mut_ptr());
2222 +(**this).clone_to_uninit(data.as_mut_ptr());
2223 2223 *this = arc.assume_init();
2224 2224 }
2225 2225 } else if this.inner().weak.load(Relaxed) != 1 {