Skip to content

Commit f8ae5e9

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

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

compiler/rustc_mir_transform/src/elaborate_drop.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -318,15 +318,20 @@ 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);
323-
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-
),
329-
);
322+
let obj_ref_place = Place::from(self.new_temp(unwrap_ty));
323+
call_statements.push(self.assign(
324+
obj_ref_place,
325+
Rvalue::Use(Operand::Copy(tcx.mk_place_field(
326+
pin_obj_place,
327+
FieldIdx::ZERO,
328+
unwrap_ty,
329+
))),
330+
));
331+
332+
let obj_ptr_place = Place::from(self.new_temp(obj_ptr_ty));
333+
334+
let addr = Rvalue::RawPtr(RawPtrKind::Mut, tcx.mk_place_deref(obj_ref_place));
330335
call_statements.push(self.assign(obj_ptr_place, addr));
331336
obj_ptr_place
332337
};
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)