diff options
| author | Andrew Zhogin <andrew.zhogin@gmail.com> | 2025-05-21 15:21:01 +0700 |
|---|---|---|
| committer | Andrew Zhogin <andrew.zhogin@gmail.com> | 2025-05-21 18:18:27 +0700 |
| commit | dc794f18a425a20563943ea4201b34ebea2aa017 (patch) | |
| tree | 3d7efcba11a5c03999d4f940dacc383d7eccb925 /compiler | |
| parent | 59372f2c81ba74554d9a71b12a4ed7f29adb33a2 (diff) | |
| download | rust-dc794f18a425a20563943ea4201b34ebea2aa017.tar.gz rust-dc794f18a425a20563943ea4201b34ebea2aa017.zip | |
When AsyncDrop impl is empty, sync drop generated in elaborator (Fixes #140974)
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_mir_transform/src/elaborate_drop.rs | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/compiler/rustc_mir_transform/src/elaborate_drop.rs b/compiler/rustc_mir_transform/src/elaborate_drop.rs index 73a58160a6a..5d86b1353c0 100644 --- a/compiler/rustc_mir_transform/src/elaborate_drop.rs +++ b/compiler/rustc_mir_transform/src/elaborate_drop.rs @@ -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); |
