Rollup merge of #123366 - oli-obk:cleanups_async_closures, r=compiler-errors
Minor by_move_body impl cleanups r? `@compiler-errors`
This commit is contained in:
commit
0bf8140a5e
@ -3,7 +3,7 @@
|
|||||||
//! be a coroutine body that takes all of its upvars by-move, and which we stash
|
//! be a coroutine body that takes all of its upvars by-move, and which we stash
|
||||||
//! into the `CoroutineInfo` for all coroutines returned by coroutine-closures.
|
//! into the `CoroutineInfo` for all coroutines returned by coroutine-closures.
|
||||||
|
|
||||||
use rustc_data_structures::fx::FxIndexSet;
|
use rustc_data_structures::unord::UnordSet;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_middle::mir::visit::MutVisitor;
|
use rustc_middle::mir::visit::MutVisitor;
|
||||||
use rustc_middle::mir::{self, dump_mir, MirPass};
|
use rustc_middle::mir::{self, dump_mir, MirPass};
|
||||||
@ -33,7 +33,7 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx>) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut by_ref_fields = FxIndexSet::default();
|
let mut by_ref_fields = UnordSet::default();
|
||||||
let by_move_upvars = Ty::new_tup_from_iter(
|
let by_move_upvars = Ty::new_tup_from_iter(
|
||||||
tcx,
|
tcx,
|
||||||
tcx.closure_captures(coroutine_def_id).iter().enumerate().map(|(idx, capture)| {
|
tcx.closure_captures(coroutine_def_id).iter().enumerate().map(|(idx, capture)| {
|
||||||
@ -73,7 +73,7 @@ fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx>) {
|
|||||||
|
|
||||||
struct MakeByMoveBody<'tcx> {
|
struct MakeByMoveBody<'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
by_ref_fields: FxIndexSet<FieldIdx>,
|
by_ref_fields: UnordSet<FieldIdx>,
|
||||||
by_move_coroutine_ty: Ty<'tcx>,
|
by_move_coroutine_ty: Ty<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,11 +89,11 @@ fn visit_place(
|
|||||||
location: mir::Location,
|
location: mir::Location,
|
||||||
) {
|
) {
|
||||||
if place.local == ty::CAPTURE_STRUCT_LOCAL
|
if place.local == ty::CAPTURE_STRUCT_LOCAL
|
||||||
&& !place.projection.is_empty()
|
&& let Some((&mir::ProjectionElem::Field(idx, ty), projection)) =
|
||||||
&& let mir::ProjectionElem::Field(idx, ty) = place.projection[0]
|
place.projection.split_first()
|
||||||
&& self.by_ref_fields.contains(&idx)
|
&& self.by_ref_fields.contains(&idx)
|
||||||
{
|
{
|
||||||
let (begin, end) = place.projection[1..].split_first().unwrap();
|
let (begin, end) = projection.split_first().unwrap();
|
||||||
// FIXME(async_closures): I'm actually a bit surprised to see that we always
|
// FIXME(async_closures): I'm actually a bit surprised to see that we always
|
||||||
// initially deref the by-ref upvars. If this is not actually true, then we
|
// initially deref the by-ref upvars. If this is not actually true, then we
|
||||||
// will at least get an ICE that explains why this isn't true :^)
|
// will at least get an ICE that explains why this isn't true :^)
|
||||||
|
Loading…
Reference in New Issue
Block a user