about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <476013+matthiaskrgr@users.noreply.github.com>2025-05-21 15:38:10 +0200
committerGitHub <noreply@github.com>2025-05-21 15:38:10 +0200
commitad6fb066dd009ce4fa03fb9392107dd23efe6789 (patch)
tree4137c161265bb2a840a740646f2d7874b9890c08
parent7a53ef7af37e01af2932204b13f058afbdc44818 (diff)
parent7c38b6fd28b1972659b662683866c359f198a6f7 (diff)
downloadrust-ad6fb066dd009ce4fa03fb9392107dd23efe6789.tar.gz
rust-ad6fb066dd009ce4fa03fb9392107dd23efe6789.zip
Rollup merge of #141296 - azhogin:azhogin/async-drop-broken-mir-place-deref-fix, r=oli-obk
Async drop fix for 'broken mir, place has deref as later projection'

fixes #140975

Problem in codegen fixed with an additional temporary local.
-rw-r--r--compiler/rustc_mir_transform/src/elaborate_drop.rs21
-rw-r--r--tests/ui/async-await/async-drop/deref-later-projection.rs (renamed from tests/crashes/140975.rs)10
2 files changed, 20 insertions, 11 deletions
diff --git a/compiler/rustc_mir_transform/src/elaborate_drop.rs b/compiler/rustc_mir_transform/src/elaborate_drop.rs
index 73a58160a6a..61312eb7d1a 100644
--- a/compiler/rustc_mir_transform/src/elaborate_drop.rs
+++ b/compiler/rustc_mir_transform/src/elaborate_drop.rs
@@ -318,15 +318,20 @@ where
                 bug!();
             };
             let obj_ptr_ty = Ty::new_mut_ptr(tcx, drop_ty);
-            let obj_ptr_place = Place::from(self.new_temp(obj_ptr_ty));
             let unwrap_ty = adt_def.non_enum_variant().fields[FieldIdx::ZERO].ty(tcx, adt_args);
-            let addr = Rvalue::RawPtr(
-                RawPtrKind::Mut,
-                pin_obj_place.project_deeper(
-                    &[ProjectionElem::Field(FieldIdx::ZERO, unwrap_ty), ProjectionElem::Deref],
-                    tcx,
-                ),
-            );
+            let obj_ref_place = Place::from(self.new_temp(unwrap_ty));
+            call_statements.push(self.assign(
+                obj_ref_place,
+                Rvalue::Use(Operand::Copy(tcx.mk_place_field(
+                    pin_obj_place,
+                    FieldIdx::ZERO,
+                    unwrap_ty,
+                ))),
+            ));
+
+            let obj_ptr_place = Place::from(self.new_temp(obj_ptr_ty));
+
+            let addr = Rvalue::RawPtr(RawPtrKind::Mut, tcx.mk_place_deref(obj_ref_place));
             call_statements.push(self.assign(obj_ptr_place, addr));
             obj_ptr_place
         };
diff --git a/tests/crashes/140975.rs b/tests/ui/async-await/async-drop/deref-later-projection.rs
index e11dd40612c..baf81daf766 100644
--- a/tests/crashes/140975.rs
+++ b/tests/ui/async-await/async-drop/deref-later-projection.rs
@@ -1,7 +1,11 @@
-//@ known-bug: #140975
-//@ compile-flags: --crate-type lib -Zvalidate-mir
-//@ edition: 2021
+// Ex-ICE: #140975
+//@ compile-flags: -Zvalidate-mir
+//@ build-pass
+//@ edition:2021
+#![crate_type = "lib"]
 #![feature(async_drop)]
+#![allow(incomplete_features)]
+
 use std::{future::AsyncDrop, pin::Pin};
 
 struct HasAsyncDrop ;