Skip to content

Commit 14a9dd6

Browse files
committed
Async drop fix for 'broken mir in AsyncDropGlue, place has deref as a later projection' (#140975)
1 parent 59372f2 commit 14a9dd6

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

compiler/rustc_mir_transform/src/elaborate_drop.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -318,14 +318,18 @@ where
318318
bug!();
319319
};
320320
let obj_ptr_ty = Ty::new_mut_ptr(tcx, drop_ty);
321-
let obj_ptr_place = Place::from(self.new_temp(obj_ptr_ty));
322321
let unwrap_ty = adt_def.non_enum_variant().fields[FieldIdx::ZERO].ty(tcx, adt_args);
322+
let obj_ref_place = Place::from(self.new_temp(unwrap_ty));
323+
call_statements.push(self.assign(obj_ref_place,
324+
Rvalue::Use(Operand::Copy(
325+
tcx.mk_place_field(pin_obj_place, FieldIdx::ZERO, unwrap_ty)
326+
))
327+
));
328+
329+
let obj_ptr_place = Place::from(self.new_temp(obj_ptr_ty));
330+
323331
let addr = Rvalue::RawPtr(
324-
RawPtrKind::Mut,
325-
pin_obj_place.project_deeper(
326-
&[ProjectionElem::Field(FieldIdx::ZERO, unwrap_ty), ProjectionElem::Deref],
327-
tcx,
328-
),
332+
RawPtrKind::Mut, tcx.mk_place_deref(obj_ref_place)
329333
);
330334
call_statements.push(self.assign(obj_ptr_place, addr));
331335
obj_ptr_place
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//@ compile-flags: -Zvalidate-mir
2+
//@ build-pass
3+
//@ edition:2021
4+
#![crate_type = "lib"]
5+
#![feature(async_drop)]
6+
#![allow(incomplete_features)]
7+
#![allow(non_camel_case_types)]
8+
9+
use std::{future::AsyncDrop, pin::Pin};
10+
11+
struct HasAsyncDrop ;
12+
impl Drop for HasAsyncDrop {
13+
fn drop(&mut self) {}
14+
}
15+
impl AsyncDrop for HasAsyncDrop {
16+
async fn drop(self: Pin<&mut Self>) {}
17+
}
18+
19+
struct Holder {
20+
inner: HasAsyncDrop,
21+
}
22+
async fn bar() {
23+
Holder {
24+
inner: HasAsyncDrop
25+
};
26+
}

0 commit comments

Comments
 (0)