eagerly initialize definitions
in sub-fn
This commit is contained in:
parent
5d0048303c
commit
420390c848
2 changed files with 25 additions and 32 deletions
|
@ -117,11 +117,6 @@ pub(crate) fn compute_regions<'a, 'tcx>(
|
||||||
Rc::clone(&location_map),
|
Rc::clone(&location_map),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Create the region inference context, taking ownership of the
|
|
||||||
// region inference data that was contained in `infcx`, and the
|
|
||||||
// base constraints generated by the type-check.
|
|
||||||
let var_infos = infcx.get_region_var_infos();
|
|
||||||
|
|
||||||
// If requested, emit legacy polonius facts.
|
// If requested, emit legacy polonius facts.
|
||||||
polonius::legacy::emit_facts(
|
polonius::legacy::emit_facts(
|
||||||
&mut polonius_facts,
|
&mut polonius_facts,
|
||||||
|
@ -134,13 +129,8 @@ pub(crate) fn compute_regions<'a, 'tcx>(
|
||||||
&constraints,
|
&constraints,
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut regioncx = RegionInferenceContext::new(
|
let mut regioncx =
|
||||||
infcx,
|
RegionInferenceContext::new(infcx, constraints, universal_region_relations, location_map);
|
||||||
var_infos,
|
|
||||||
constraints,
|
|
||||||
universal_region_relations,
|
|
||||||
location_map,
|
|
||||||
);
|
|
||||||
|
|
||||||
// If requested for `-Zpolonius=next`, convert NLL constraints to localized outlives constraints
|
// If requested for `-Zpolonius=next`, convert NLL constraints to localized outlives constraints
|
||||||
// and use them to compute loan liveness.
|
// and use them to compute loan liveness.
|
||||||
|
|
|
@ -9,7 +9,7 @@ use rustc_errors::Diag;
|
||||||
use rustc_hir::def_id::CRATE_DEF_ID;
|
use rustc_hir::def_id::CRATE_DEF_ID;
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
use rustc_infer::infer::outlives::test_type_match;
|
use rustc_infer::infer::outlives::test_type_match;
|
||||||
use rustc_infer::infer::region_constraints::{GenericKind, VarInfos, VerifyBound, VerifyIfEq};
|
use rustc_infer::infer::region_constraints::{GenericKind, VerifyBound, VerifyIfEq};
|
||||||
use rustc_infer::infer::{InferCtxt, NllRegionVariableOrigin, RegionVariableOrigin};
|
use rustc_infer::infer::{InferCtxt, NllRegionVariableOrigin, RegionVariableOrigin};
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::mir::{
|
use rustc_middle::mir::{
|
||||||
|
@ -145,7 +145,7 @@ pub struct RegionInferenceContext<'tcx> {
|
||||||
/// variables are identified by their index (`RegionVid`). The
|
/// variables are identified by their index (`RegionVid`). The
|
||||||
/// definition contains information about where the region came
|
/// definition contains information about where the region came
|
||||||
/// from as well as its final inferred value.
|
/// from as well as its final inferred value.
|
||||||
pub(crate) definitions: IndexVec<RegionVid, RegionDefinition<'tcx>>,
|
pub(crate) definitions: Frozen<IndexVec<RegionVid, RegionDefinition<'tcx>>>,
|
||||||
|
|
||||||
/// The liveness constraints added to each region. For most
|
/// The liveness constraints added to each region. For most
|
||||||
/// regions, these start out empty and steadily grow, though for
|
/// regions, these start out empty and steadily grow, though for
|
||||||
|
@ -385,6 +385,26 @@ fn sccs_info<'tcx>(infcx: &BorrowckInferCtxt<'tcx>, sccs: &ConstraintSccs) {
|
||||||
debug!("SCC edges {:#?}", scc_node_to_edges);
|
debug!("SCC edges {:#?}", scc_node_to_edges);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_definitions<'tcx>(
|
||||||
|
infcx: &BorrowckInferCtxt<'tcx>,
|
||||||
|
universal_regions: &UniversalRegions<'tcx>,
|
||||||
|
) -> Frozen<IndexVec<RegionVid, RegionDefinition<'tcx>>> {
|
||||||
|
// Create a RegionDefinition for each inference variable.
|
||||||
|
let mut definitions: IndexVec<_, _> = infcx
|
||||||
|
.get_region_var_infos()
|
||||||
|
.iter()
|
||||||
|
.map(|info| RegionDefinition::new(info.universe, info.origin))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
// Add the external name for all universal regions.
|
||||||
|
for (external_name, variable) in universal_regions.named_universal_regions_iter() {
|
||||||
|
debug!("region {variable:?} has external name {external_name:?}");
|
||||||
|
definitions[variable].external_name = Some(external_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
Frozen::freeze(definitions)
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> RegionInferenceContext<'tcx> {
|
impl<'tcx> RegionInferenceContext<'tcx> {
|
||||||
/// Creates a new region inference context with a total of
|
/// Creates a new region inference context with a total of
|
||||||
/// `num_region_variables` valid inference variables; the first N
|
/// `num_region_variables` valid inference variables; the first N
|
||||||
|
@ -395,7 +415,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||||
/// of constraints produced by the MIR type check.
|
/// of constraints produced by the MIR type check.
|
||||||
pub(crate) fn new(
|
pub(crate) fn new(
|
||||||
infcx: &BorrowckInferCtxt<'tcx>,
|
infcx: &BorrowckInferCtxt<'tcx>,
|
||||||
var_infos: VarInfos,
|
|
||||||
constraints: MirTypeckRegionConstraints<'tcx>,
|
constraints: MirTypeckRegionConstraints<'tcx>,
|
||||||
universal_region_relations: Frozen<UniversalRegionRelations<'tcx>>,
|
universal_region_relations: Frozen<UniversalRegionRelations<'tcx>>,
|
||||||
location_map: Rc<DenseLocationMap>,
|
location_map: Rc<DenseLocationMap>,
|
||||||
|
@ -426,11 +445,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||||
infcx.set_tainted_by_errors(guar);
|
infcx.set_tainted_by_errors(guar);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a RegionDefinition for each inference variable.
|
let definitions = create_definitions(infcx, &universal_regions);
|
||||||
let definitions: IndexVec<_, _> = var_infos
|
|
||||||
.iter()
|
|
||||||
.map(|info| RegionDefinition::new(info.universe, info.origin))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let constraint_sccs =
|
let constraint_sccs =
|
||||||
outlives_constraints.add_outlives_static(&universal_regions, &definitions);
|
outlives_constraints.add_outlives_static(&universal_regions, &definitions);
|
||||||
|
@ -526,18 +541,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
||||||
/// means that the `R1: !1` constraint here will cause
|
/// means that the `R1: !1` constraint here will cause
|
||||||
/// `R1` to become `'static`.
|
/// `R1` to become `'static`.
|
||||||
fn init_free_and_bound_regions(&mut self) {
|
fn init_free_and_bound_regions(&mut self) {
|
||||||
// Update the names (if any)
|
|
||||||
// This iterator has unstable order but we collect it all into an IndexVec
|
|
||||||
for (external_name, variable) in
|
|
||||||
self.universal_region_relations.universal_regions.named_universal_regions_iter()
|
|
||||||
{
|
|
||||||
debug!(
|
|
||||||
"init_free_and_bound_regions: region {:?} has external name {:?}",
|
|
||||||
variable, external_name
|
|
||||||
);
|
|
||||||
self.definitions[variable].external_name = Some(external_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
for variable in self.definitions.indices() {
|
for variable in self.definitions.indices() {
|
||||||
let scc = self.constraint_sccs.scc(variable);
|
let scc = self.constraint_sccs.scc(variable);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue