allocate before calling T::default in <Box>::default() · qinheping/verify-rust-std@669e255 (original) (raw)

Skip to content

Provide feedback

Saved searches

Use saved searches to filter your results more quickly

Sign up

Commit 669e255

allocate before calling T::default in <Box>::default()

The `Box<T: Default>` impl currently calls `T::default()` before allocating the `Box`. Most `Default` impls are trivial, which should in theory allow LLVM to construct `T: Default` directly in the `Box` allocation when calling `<Box>::default()`. However, the allocation may fail, which necessitates calling `T's` destructor if it has one. If the destructor is non-trivial, then LLVM has a hard time proving that it's sound to elide, which makes it construct `T` on the stack first, and then copy it into the allocation. Create an uninit `Box` first, and then write `T::default` into it, so that LLVM now only needs to prove that the `T::default` can't panic, which should be trivial for most `Default` impls.

File tree

1 file changed

lines changed

1 file changed

lines changed

Original file line number Diff line number Diff line change
@@ -1688,7 +1688,7 @@ impl<T: Default> Default for Box {
1688 1688 /// Creates a `Box`, with the `Default` value for T.
1689 1689 #[inline]
1690 1690 fn default() -> Self {
1691 -Box::new(T::default())
1691 +Box::write(Box::new_uninit(), T::default())
1692 1692 }
1693 1693 }
1694 1694