Don't store region in CapturedPlace

This commit is contained in:
Michael Goulet 2024-09-05 08:42:50 -04:00
parent eb33b43bab
commit e04ede46bb
2 changed files with 19 additions and 43 deletions

View File

@ -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())
}
} }
} }

View File

@ -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> {