about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorAndrew Zhogin <andrew.zhogin@gmail.com>2025-05-21 15:21:01 +0700
committerAndrew Zhogin <andrew.zhogin@gmail.com>2025-05-21 18:18:27 +0700
commitdc794f18a425a20563943ea4201b34ebea2aa017 (patch)
tree3d7efcba11a5c03999d4f940dacc383d7eccb925 /compiler
parent59372f2c81ba74554d9a71b12a4ed7f29adb33a2 (diff)
downloadrust-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.rs24
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);