@@ -161,6 +161,11 @@ async unsafe fn surface_drop_in_place<T: Drop + ?Sized>(ptr: *mut T) {
161161/// wrapped future completes by returning `Poll::Ready(())` on poll. This
162162/// is useful for constructing async destructors to guarantee this
163163/// "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.
164169struct Fuse < T > {
165170inner : Option < T > ,
166171}
@@ -251,6 +256,12 @@ async unsafe fn either<O: IntoFuture<Output = ()>, M: IntoFuture<Output = ()>, T
251256}
252257}
253258
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+
254265/// Used for noop async destructors. We don't use [`core::future::Ready`]
255266/// because it panics after its second poll, which could be potentially
256267/// bad if that would happen during the cleanup.