mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Don't store region in CapturedPlace
This commit is contained in:
parent
eb33b43bab
commit
e04ede46bb
@ -39,7 +39,6 @@ use rustc_hir as hir;
|
|||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
use rustc_hir::HirId;
|
use rustc_hir::HirId;
|
||||||
use rustc_infer::infer::UpvarRegion;
|
|
||||||
use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, Projection, ProjectionKind};
|
use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, Projection, ProjectionKind};
|
||||||
use rustc_middle::mir::FakeReadCause;
|
use rustc_middle::mir::FakeReadCause;
|
||||||
use rustc_middle::traits::ObligationCauseCode;
|
use rustc_middle::traits::ObligationCauseCode;
|
||||||
@ -425,7 +424,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
self.tcx,
|
self.tcx,
|
||||||
upvar_ty,
|
upvar_ty,
|
||||||
capture,
|
capture,
|
||||||
if needs_ref { Some(closure_env_region) } else { child_capture.region },
|
if needs_ref {
|
||||||
|
closure_env_region
|
||||||
|
} else {
|
||||||
|
self.tcx.lifetimes.re_erased
|
||||||
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -587,7 +590,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
|
|
||||||
debug!(?captured_place.place, ?upvar_ty, ?capture, ?captured_place.mutability);
|
debug!(?captured_place.place, ?upvar_ty, ?capture, ?captured_place.mutability);
|
||||||
|
|
||||||
apply_capture_kind_on_capture_ty(self.tcx, upvar_ty, capture, captured_place.region)
|
apply_capture_kind_on_capture_ty(
|
||||||
|
self.tcx,
|
||||||
|
upvar_ty,
|
||||||
|
capture,
|
||||||
|
self.tcx.lifetimes.re_erased,
|
||||||
|
)
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
@ -775,13 +783,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
|
|
||||||
let Some(min_cap_list) = root_var_min_capture_list.get_mut(&var_hir_id) else {
|
let Some(min_cap_list) = root_var_min_capture_list.get_mut(&var_hir_id) else {
|
||||||
let mutability = self.determine_capture_mutability(&typeck_results, &place);
|
let mutability = self.determine_capture_mutability(&typeck_results, &place);
|
||||||
let min_cap_list = vec![ty::CapturedPlace {
|
let min_cap_list =
|
||||||
var_ident,
|
vec![ty::CapturedPlace { var_ident, place, info: capture_info, mutability }];
|
||||||
place,
|
|
||||||
info: capture_info,
|
|
||||||
mutability,
|
|
||||||
region: None,
|
|
||||||
}];
|
|
||||||
root_var_min_capture_list.insert(var_hir_id, min_cap_list);
|
root_var_min_capture_list.insert(var_hir_id, min_cap_list);
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
@ -874,34 +877,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
// Only need to insert when we don't have an ancestor in the existing min capture list
|
// Only need to insert when we don't have an ancestor in the existing min capture list
|
||||||
if !ancestor_found {
|
if !ancestor_found {
|
||||||
let mutability = self.determine_capture_mutability(&typeck_results, &place);
|
let mutability = self.determine_capture_mutability(&typeck_results, &place);
|
||||||
let captured_place = ty::CapturedPlace {
|
let captured_place =
|
||||||
var_ident,
|
ty::CapturedPlace { var_ident, place, info: updated_capture_info, mutability };
|
||||||
place,
|
|
||||||
info: updated_capture_info,
|
|
||||||
mutability,
|
|
||||||
region: None,
|
|
||||||
};
|
|
||||||
min_cap_list.push(captured_place);
|
min_cap_list.push(captured_place);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For each capture that is determined to be captured by ref, add region info.
|
|
||||||
for (_, captures) in &mut root_var_min_capture_list {
|
|
||||||
for capture in captures {
|
|
||||||
match capture.info.capture_kind {
|
|
||||||
ty::UpvarCapture::ByRef(_) => {
|
|
||||||
let PlaceBase::Upvar(upvar_id) = capture.place.base else {
|
|
||||||
bug!("expected upvar")
|
|
||||||
};
|
|
||||||
let origin = UpvarRegion(upvar_id, closure_span);
|
|
||||||
let upvar_region = self.next_region_var(origin);
|
|
||||||
capture.region = Some(upvar_region);
|
|
||||||
}
|
|
||||||
_ => (),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
debug!(
|
debug!(
|
||||||
"For closure={:?}, min_captures before sorting={:?}",
|
"For closure={:?}, min_captures before sorting={:?}",
|
||||||
closure_def_id, root_var_min_capture_list
|
closure_def_id, root_var_min_capture_list
|
||||||
@ -1195,7 +1176,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
self.tcx,
|
self.tcx,
|
||||||
ty,
|
ty,
|
||||||
max_capture_info.capture_kind,
|
max_capture_info.capture_kind,
|
||||||
Some(self.tcx.lifetimes.re_erased),
|
self.tcx.lifetimes.re_erased,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1217,7 +1198,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
self.tcx,
|
self.tcx,
|
||||||
capture.place.ty(),
|
capture.place.ty(),
|
||||||
capture.info.capture_kind,
|
capture.info.capture_kind,
|
||||||
Some(self.tcx.lifetimes.re_erased),
|
self.tcx.lifetimes.re_erased,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Checks if a capture implements any of the auto traits
|
// Checks if a capture implements any of the auto traits
|
||||||
@ -1935,13 +1916,11 @@ fn apply_capture_kind_on_capture_ty<'tcx>(
|
|||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
capture_kind: UpvarCapture,
|
capture_kind: UpvarCapture,
|
||||||
region: Option<ty::Region<'tcx>>,
|
region: ty::Region<'tcx>,
|
||||||
) -> Ty<'tcx> {
|
) -> Ty<'tcx> {
|
||||||
match capture_kind {
|
match capture_kind {
|
||||||
ty::UpvarCapture::ByValue => ty,
|
ty::UpvarCapture::ByValue => ty,
|
||||||
ty::UpvarCapture::ByRef(kind) => {
|
ty::UpvarCapture::ByRef(kind) => Ty::new_ref(tcx, region, ty, kind.to_mutbl_lossy()),
|
||||||
Ty::new_ref(tcx, region.unwrap(), ty, kind.to_mutbl_lossy())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,9 +88,6 @@ pub struct CapturedPlace<'tcx> {
|
|||||||
|
|
||||||
/// Represents if `place` can be mutated or not.
|
/// Represents if `place` can be mutated or not.
|
||||||
pub mutability: hir::Mutability,
|
pub mutability: hir::Mutability,
|
||||||
|
|
||||||
/// Region of the resulting reference if the upvar is captured by ref.
|
|
||||||
pub region: Option<ty::Region<'tcx>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> CapturedPlace<'tcx> {
|
impl<'tcx> CapturedPlace<'tcx> {
|
||||||
|
Loading…
Reference in New Issue
Block a user