When AsyncDrop impl is empty, sync drop generated in elaborator (Fixes #140974)

This commit is contained in:
Andrew Zhogin 2025-05-21 15:21:01 +07:00
parent 59372f2c81
commit dc794f18a4
3 changed files with 39 additions and 3 deletions

View file

@ -251,7 +251,29 @@ where
span_bug!(span, "invalid `AsyncDrop` impl_source: {:?}", impl_source);
}
};
let drop_fn_def_id = tcx.associated_item_def_ids(drop_trait)[0];
// impl_item_refs may be empty if drop fn is not implemented in 'impl AsyncDrop for ...'
// (#140974).
// Such code will report error, so just generate sync drop here and return
let Some(drop_fn_def_id) =
tcx.associated_item_def_ids(drop_trait).into_iter().nth(0).copied()
else {
tcx.dcx().span_delayed_bug(
self.elaborator.body().span,
"AsyncDrop type without correct `async fn drop(...)`.",
);
self.elaborator.patch().patch_terminator(
pin_obj_bb,
TerminatorKind::Drop {
place,
target: succ,
unwind: unwind.into_action(),
replace: false,
drop: None,
async_fut: None,
},
);
return pin_obj_bb;
};
let drop_fn = Ty::new_fn_def(tcx, drop_fn_def_id, trait_args);
let sig = drop_fn.fn_sig(tcx);
let sig = tcx.instantiate_bound_regions_with_erased(sig);

View file

@ -1,5 +1,7 @@
//@ known-bug: #140974
//@edition:2021
//@ edition: 2024
// Ex-ICE: #140974
#![crate_type = "lib"]
#![allow(incomplete_features)]
#![feature(async_drop)]
use core::future::AsyncDrop;
@ -10,5 +12,6 @@ impl Drop for HasIncompleteAsyncDrop {
fn drop(&mut self) {}
}
impl AsyncDrop for HasIncompleteAsyncDrop {
//~^ ERROR: not all trait items implemented, missing: `drop` [E0046]
// not implemented yet..
}

View file

@ -0,0 +1,11 @@
error[E0046]: not all trait items implemented, missing: `drop`
--> $DIR/elaborate-index-out-of-bounds.rs:14:1
|
LL | impl AsyncDrop for HasIncompleteAsyncDrop {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `drop` in implementation
|
= help: implement the missing item: `async fn drop(self: Pin<&mut Self>) { todo!() }`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0046`.