tcx: TyCtxt<'tcx>,
closure_substs: SubstsRef<'tcx>,
expected_num_vars: usize,
- typeck_root_def_id: DefId,
+ closure_def_id: LocalDefId,
) -> IndexVec<RegionVid, ty::Region<'tcx>> {
let mut region_mapping = IndexVec::with_capacity(expected_num_vars);
region_mapping.push(tcx.lifetimes.re_static);
region_mapping.push(fr);
});
- for_each_late_bound_region_defined_on(tcx, typeck_root_def_id, |r| {
+ for_each_late_bound_region_in_recursive_scope(tcx, tcx.local_parent(closure_def_id), |r| {
region_mapping.push(r);
});
// tests, and the resulting print-outs include def-ids
// and other things that are not stable across tests!
// So we just include the region-vid. Annoying.
- let typeck_root_def_id = tcx.typeck_root_def_id(def_id);
- for_each_late_bound_region_defined_on(tcx, typeck_root_def_id, |r| {
- err.note(&format!("late-bound region is {:?}", self.to_region_vid(r),));
+ for_each_late_bound_region_in_recursive_scope(tcx, def_id.expect_local(), |r| {
+ err.note(&format!("late-bound region is {:?}", self.to_region_vid(r)));
});
}
DefiningTy::Generator(def_id, substs, _) => {
// FIXME: As above, we'd like to print out the region
// `r` but doing so is not stable across architectures
// and so forth.
- let typeck_root_def_id = tcx.typeck_root_def_id(def_id);
- for_each_late_bound_region_defined_on(tcx, typeck_root_def_id, |r| {
- err.note(&format!("late-bound region is {:?}", self.to_region_vid(r),));
+ for_each_late_bound_region_in_recursive_scope(tcx, def_id.expect_local(), |r| {
+ err.note(&format!("late-bound region is {:?}", self.to_region_vid(r)));
});
}
DefiningTy::FnDef(def_id, substs) => {
// fn foo<'a>() {
// let c = || { let x: &'a u32 = ...; }
// }
- self.infcx.replace_late_bound_regions_with_nll_infer_vars(
+ for_each_late_bound_region_in_recursive_scope(
+ self.infcx.tcx,
self.infcx.tcx.local_parent(self.mir_def.did),
- &mut indices,
+ |r| {
+ debug!(?r);
+ if !indices.indices.contains_key(&r) {
+ let region_vid = self.infcx.next_nll_region_var(FR);
+ debug!(?region_vid);
+ indices.insert_late_bound_region(r, region_vid.to_region_vid());
+ }
+ },
);
+
// Any regions created during the execution of `defining_ty` or during the above
// late-bound region replacement are all considered 'extern' regions
self.infcx.num_region_vars()
);
// Converse of above, if this is a function/closure then the late-bound regions declared on its
// signature are local.
- self.infcx.replace_late_bound_regions_with_nll_infer_vars(self.mir_def.did, &mut indices);
+ for_each_late_bound_region_in_item(self.infcx.tcx, self.mir_def.did, |r| {
+ debug!(?r);
+ if !indices.indices.contains_key(&r) {
+ let region_vid = self.infcx.next_nll_region_var(FR);
+ debug!(?region_vid);
+ indices.insert_late_bound_region(r, region_vid.to_region_vid());
+ }
+ });
let (unnormalized_output_ty, mut unnormalized_input_tys) =
inputs_and_output.split_last().unwrap();
where
T: TypeFoldable<'tcx>;
- fn replace_late_bound_regions_with_nll_infer_vars(
+ fn replace_late_bound_regions_with_nll_infer_vars_in_recursive_scope(
+ &self,
+ mir_def_id: LocalDefId,
+ indices: &mut UniversalRegionIndices<'tcx>,
+ );
+
+ fn replace_late_bound_regions_with_nll_infer_vars_in_item(
&self,
mir_def_id: LocalDefId,
indices: &mut UniversalRegionIndices<'tcx>,
/// set of late-bound regions and checks for any that we have not yet seen, adding them to the
/// inputs vector.
#[instrument(skip(self, indices))]
- fn replace_late_bound_regions_with_nll_infer_vars(
+ fn replace_late_bound_regions_with_nll_infer_vars_in_recursive_scope(
&self,
- mut mir_def_id: LocalDefId,
+ mir_def_id: LocalDefId,
indices: &mut UniversalRegionIndices<'tcx>,
) {
- let typeck_root_def_id = self.tcx.typeck_root_def_id(mir_def_id.to_def_id());
-
- // Walk up the tree, collecting late-bound regions until we hit the typeck root
- loop {
- for_each_late_bound_region_defined_on(self.tcx, mir_def_id.to_def_id(), |r| {
- debug!(?r);
- if !indices.indices.contains_key(&r) {
- let region_vid = self.next_nll_region_var(FR);
- debug!(?region_vid);
- indices.insert_late_bound_region(r, region_vid.to_region_vid());
- }
- });
+ for_each_late_bound_region_in_recursive_scope(self.tcx, mir_def_id, |r| {
+ debug!(?r);
+ if !indices.indices.contains_key(&r) {
+ let region_vid = self.next_nll_region_var(FR);
+ debug!(?region_vid);
+ indices.insert_late_bound_region(r, region_vid.to_region_vid());
+ }
+ });
+ }
- if mir_def_id.to_def_id() == typeck_root_def_id {
- break;
- } else {
- mir_def_id = self.tcx.parent(mir_def_id.to_def_id()).expect_local();
+ #[instrument(skip(self, indices))]
+ fn replace_late_bound_regions_with_nll_infer_vars_in_item(
+ &self,
+ mir_def_id: LocalDefId,
+ indices: &mut UniversalRegionIndices<'tcx>,
+ ) {
+ for_each_late_bound_region_in_item(self.tcx, mir_def_id, |r| {
+ debug!(?r);
+ if !indices.indices.contains_key(&r) {
+ let region_vid = self.next_nll_region_var(FR);
+ debug!(?region_vid);
+ indices.insert_late_bound_region(r, region_vid.to_region_vid());
}
- }
+ });
}
}
}
}
-/// Iterates over the late-bound regions defined on fn_def_id and
-/// invokes `f` with the liberated form of each one.
-fn for_each_late_bound_region_defined_on<'tcx>(
+/// Iterates over the late-bound regions defined on `mir_def_id` and all of its
+/// parents, up to the typeck root, and invokes `f` with the liberated form
+/// of each one.
+fn for_each_late_bound_region_in_recursive_scope<'tcx>(
tcx: TyCtxt<'tcx>,
- fn_def_id: DefId,
+ mut mir_def_id: LocalDefId,
mut f: impl FnMut(ty::Region<'tcx>),
) {
- for bound_var in tcx.late_bound_vars(tcx.hir().local_def_id_to_hir_id(fn_def_id.expect_local()))
- {
+ let typeck_root_def_id = tcx.typeck_root_def_id(mir_def_id.to_def_id());
+
+ // Walk up the tree, collecting late-bound regions until we hit the typeck root
+ loop {
+ for_each_late_bound_region_in_item(tcx, mir_def_id, &mut f);
+
+ if mir_def_id.to_def_id() == typeck_root_def_id {
+ break;
+ } else {
+ mir_def_id = tcx.local_parent(mir_def_id);
+ }
+ }
+}
+
+/// Iterates over the late-bound regions defined on `mir_def_id` and all of its
+/// parents, up to the typeck root, and invokes `f` with the liberated form
+/// of each one.
+fn for_each_late_bound_region_in_item<'tcx>(
+ tcx: TyCtxt<'tcx>,
+ mir_def_id: LocalDefId,
+ mut f: impl FnMut(ty::Region<'tcx>),
+) {
+ if !tcx.def_kind(mir_def_id).is_fn_like() {
+ return;
+ }
+
+ for bound_var in tcx.late_bound_vars(tcx.hir().local_def_id_to_hir_id(mir_def_id)) {
let ty::BoundVariableKind::Region(bound_region) = bound_var else { continue; };
- let liberated_region =
- tcx.mk_region(ty::ReFree(ty::FreeRegion { scope: fn_def_id, bound_region }));
+ let liberated_region = tcx
+ .mk_region(ty::ReFree(ty::FreeRegion { scope: mir_def_id.to_def_id(), bound_region }));
f(liberated_region);
}
}