Optimize async drop glue for some old types · model-checking/verify-rust-std@c8b699c (original) (raw)

Original file line number Diff line number Diff line change
@@ -161,6 +161,11 @@ async unsafe fn surface_drop_in_place<T: Drop + ?Sized>(ptr: *mut T) {
161 161 /// wrapped future completes by returning `Poll::Ready(())` on poll. This
162 162 /// is useful for constructing async destructors to guarantee this
163 163 /// "fuse" property
164 +//
165 +// FIXME: Consider optimizing combinators to not have to use fuse in majority
166 +// of cases, perhaps by adding `#[(rustc_)idempotent(_future)]` attribute for
167 +// async functions and blocks with the unit return type. However current layout
168 +// optimizations currently encode `None` case into the async block's discriminant.
164 169 struct Fuse<T> {
165 170 inner: Option<T>,
166 171 }
@@ -251,6 +256,12 @@ async unsafe fn either<O: IntoFuture<Output = ()>, M: IntoFuture<Output = ()>, T
251 256 }
252 257 }
253 258
259 +#[cfg(not(bootstrap))]
260 +#[lang = "async_drop_deferred_drop_in_place"]
261 +async unsafe fn deferred_drop_in_place<T>(to_drop: *mut T) {
262 +unsafe { crate::ptr::drop_in_place(to_drop) }
263 +}
264 +
254 265 /// Used for noop async destructors. We don't use [`core::future::Ready`]
255 266 /// because it panics after its second poll, which could be potentially
256 267 /// bad if that would happen during the cleanup.