/// anywhere. There is only one, `'static`.
Global,
- /// An **external** region is only relevant for closures. In that
- /// case, it refers to regions that are free in the closure type
+ /// An **external** region is only relevant for
+ /// closures, generators, and inline consts. In that
+ /// case, it refers to regions that are free in the type
/// -- basically, something bound in the surrounding context.
///
/// Consider this example:
/// Here, the lifetimes `'a` and `'b` would be **external** to the
/// closure.
///
- /// If we are not analyzing a closure, there are no external
- /// lifetimes.
+ /// If we are not analyzing a closure/generator/inline-const,
+ /// there are no external lifetimes.
External,
/// A **local** lifetime is one about which we know the full set
let typeck_root_def_id = self.infcx.tcx.typeck_root_def_id(self.mir_def.did.to_def_id());
- // If this is a closure or generator, then the late-bound regions from the enclosing
- // function are actually external regions to us. For example, here, 'a is not local
- // to the closure c (although it is local to the fn foo):
- // fn foo<'a>() {
- // let c = || { let x: &'a u32 = ...; }
- // }
- if self.mir_def.did.to_def_id() != typeck_root_def_id {
+ // If this is is a 'root' body (not a closure/generator/inline const), then
+ // there are no extern regions, so the local regions start at the same
+ // position as the (empty) sub-list of extern regions
+ let first_local_index = if self.mir_def.did.to_def_id() == typeck_root_def_id {
+ first_extern_index
+ } else {
+ // If this is a closure, generator, or inline-const, then the late-bound regions from the enclosing
+ // function are actually external regions to us. For example, here, 'a is not local
+ // to the closure c (although it is local to the fn foo):
+ // fn foo<'a>() {
+ // let c = || { let x: &'a u32 = ...; }
+ // }
self.infcx
- .replace_late_bound_regions_with_nll_infer_vars(self.mir_def.did, &mut indices)
- }
-
- let bound_inputs_and_output = self.compute_inputs_and_output(&indices, defining_ty);
+ .replace_late_bound_regions_with_nll_infer_vars(self.mir_def.did, &mut indices);
+ // 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()
+ };
// "Liberate" the late-bound regions. These correspond to
// "local" free regions.
- let first_local_index = self.infcx.num_region_vars();
+
+ let bound_inputs_and_output = self.compute_inputs_and_output(&indices, defining_ty);
+
let inputs_and_output = self.infcx.replace_bound_regions_with_nll_infer_vars(
FR,
self.mir_def.did,
self.tcx.fold_regions(value, &mut false, |_region, _depth| self.next_nll_region_var(origin))
}
+ #[instrument(level = "debug", skip(self, indices))]
fn replace_bound_regions_with_nll_infer_vars<T>(
&self,
origin: NllRegionVariableOrigin,
where
T: TypeFoldable<'tcx>,
{
- debug!(
- "replace_bound_regions_with_nll_infer_vars(value={:?}, all_outlive_scope={:?})",
- value, all_outlive_scope,
- );
let (value, _map) = self.tcx.replace_late_bound_regions(value, |br| {
- debug!("replace_bound_regions_with_nll_infer_vars: br={:?}", br);
+ debug!(?br);
let liberated_region = self.tcx.mk_region(ty::ReFree(ty::FreeRegion {
scope: all_outlive_scope.to_def_id(),
bound_region: br.kind,
}));
let region_vid = self.next_nll_region_var(origin);
indices.insert_late_bound_region(liberated_region, region_vid.to_region_vid());
- debug!(
- "replace_bound_regions_with_nll_infer_vars: liberated_region={:?} => {:?}",
- liberated_region, region_vid
- );
+ debug!(?liberated_region, ?region_vid);
region_vid
});
value
/// entries for them and store them in the indices map. This code iterates over the complete
/// 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(
&self,
mir_def_id: LocalDefId,
debug!("replace_late_bound_regions_with_nll_infer_vars: r={:?}", 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());
}
});