allocate before calling T::default in <Arc>::default() · qinheping/verify-rust-std@8547f51 (original) (raw)

2 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -104,6 +104,7 @@
104 104 #![feature(async_closure)]
105 105 #![feature(async_fn_traits)]
106 106 #![feature(async_iterator)]
107 +#![feature(box_uninit_write)]
107 108 #![feature(clone_to_uninit)]
108 109 #![feature(coerce_unsized)]
109 110 #![feature(const_align_of_val)]
Original file line number Diff line number Diff line change
@@ -3447,7 +3447,13 @@ impl<T: Default> Default for Arc {
3447 3447 /// assert_eq!(*x, 0);
3448 3448 /// ```
3449 3449 fn default() -> Arc<T> {
3450 -Arc::new(Default::default())
3450 +let x = Box::into_raw(Box::write(Box::new_uninit(), ArcInner {
3451 +strong: atomic::AtomicUsize::new(1),
3452 +weak: atomic::AtomicUsize::new(1),
3453 +data: T::default(),
3454 +}));
3455 +// SAFETY: `Box::into_raw` consumes the `Box` and never returns null
3456 +unsafe { Self::from_inner(NonNull::new_unchecked(x)) }
3451 3457 }
3452 3458 }
3453 3459