Rollup merge of #132031 - slanterns:rc_default, r=ibraheemdev · qinheping/verify-rust-std@054b256 (original) (raw)

2 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -2312,7 +2312,16 @@ impl<T: Default> Default for Rc {
2312 2312 /// ```
2313 2313 #[inline]
2314 2314 fn default() -> Rc<T> {
2315 -Rc::new(Default::default())
2315 +unsafe {
2316 +Self::from_inner(
2317 +Box::leak(Box::write(Box::new_uninit(), RcInner {
2318 +strong: Cell::new(1),
2319 +weak: Cell::new(1),
2320 +value: T::default(),
2321 +}))
2322 +.into(),
2323 +)
2324 +}
2316 2325 }
2317 2326 }
2318 2327
Original file line number Diff line number Diff line change
@@ -3447,13 +3447,16 @@ impl<T: Default> Default for Arc {
3447 3447 /// assert_eq!(*x, 0);
3448 3448 /// ```
3449 3449 fn default() -> Arc<T> {
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)) }
3450 +unsafe {
3451 +Self::from_inner(
3452 +Box::leak(Box::write(Box::new_uninit(), ArcInner {
3453 +strong: atomic::AtomicUsize::new(1),
3454 +weak: atomic::AtomicUsize::new(1),
3455 +data: T::default(),
3456 +}))
3457 +.into(),
3458 +)
3459 +}
3457 3460 }
3458 3461 }
3459 3462