Skip to content

Commit 1c428ec

Browse files
committed
move type_check out of compute_regions
1 parent 61cb1e9 commit 1c428ec

File tree

2 files changed

+53
-38
lines changed

2 files changed

+53
-38
lines changed

compiler/rustc_borrowck/src/lib.rs

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use std::borrow::Cow;
1919
use std::cell::{OnceCell, RefCell};
2020
use std::marker::PhantomData;
2121
use std::ops::{ControlFlow, Deref};
22+
use std::rc::Rc;
2223

2324
use borrow_set::LocalsStateAtExit;
2425
use root_cx::BorrowCheckRootCtxt;
@@ -44,6 +45,7 @@ use rustc_mir_dataflow::impls::{EverInitializedPlaces, MaybeUninitializedPlaces}
4445
use rustc_mir_dataflow::move_paths::{
4546
InitIndex, InitLocation, LookupResult, MoveData, MovePathIndex,
4647
};
48+
use rustc_mir_dataflow::points::DenseLocationMap;
4749
use rustc_mir_dataflow::{Analysis, Results, ResultsVisitor, visit_results};
4850
use rustc_session::lint::builtin::{TAIL_EXPR_DROP_ORDER, UNUSED_MUT};
4951
use rustc_span::{ErrorGuaranteed, Span, Symbol};
@@ -60,11 +62,14 @@ use crate::path_utils::*;
6062
use crate::place_ext::PlaceExt;
6163
use crate::places_conflict::{PlaceConflictBias, places_conflict};
6264
use crate::polonius::PoloniusDiagnosticsContext;
63-
use crate::polonius::legacy::{PoloniusLocationTable, PoloniusOutput};
65+
use crate::polonius::legacy::{
66+
PoloniusFacts, PoloniusFactsExt, PoloniusLocationTable, PoloniusOutput,
67+
};
6468
use crate::prefixes::PrefixSet;
6569
use crate::region_infer::RegionInferenceContext;
6670
use crate::renumber::RegionCtxt;
6771
use crate::session_diagnostics::VarNeedNotMut;
72+
use crate::type_check::MirTypeckResults;
6873

6974
mod borrow_set;
7075
mod borrowck_errors;
@@ -321,7 +326,34 @@ fn do_mir_borrowck<'tcx>(
321326
let locals_are_invalidated_at_exit = tcx.hir_body_owner_kind(def).is_fn_or_closure();
322327
let borrow_set = BorrowSet::build(tcx, body, locals_are_invalidated_at_exit, &move_data);
323328

324-
// Compute non-lexical lifetimes.
329+
let location_map = Rc::new(DenseLocationMap::new(body));
330+
331+
let polonius_input = root_cx.consumer.as_ref().map_or(false, |c| c.polonius_input())
332+
|| infcx.tcx.sess.opts.unstable_opts.polonius.is_legacy_enabled();
333+
let mut polonius_facts =
334+
(polonius_input || PoloniusFacts::enabled(infcx.tcx)).then_some(PoloniusFacts::default());
335+
336+
// Run the MIR type-checker.
337+
let MirTypeckResults {
338+
constraints,
339+
universal_region_relations,
340+
opaque_type_values,
341+
polonius_context,
342+
} = type_check::type_check(
343+
root_cx,
344+
&infcx,
345+
body,
346+
&promoted,
347+
universal_regions,
348+
&location_table,
349+
&borrow_set,
350+
&mut polonius_facts,
351+
&move_data,
352+
Rc::clone(&location_map),
353+
);
354+
355+
// Compute non-lexical lifetimes using the constraints computed
356+
// by typechecking the MIR body.
325357
let nll::NllOutput {
326358
regioncx,
327359
polonius_input,
@@ -332,14 +364,19 @@ fn do_mir_borrowck<'tcx>(
332364
} = nll::compute_regions(
333365
root_cx,
334366
&infcx,
335-
universal_regions,
336367
body,
337-
&promoted,
338368
&location_table,
339369
&move_data,
340370
&borrow_set,
371+
location_map,
372+
universal_region_relations,
373+
constraints,
374+
polonius_facts,
375+
polonius_context,
341376
);
342377

378+
regioncx.infer_opaque_types(root_cx, &infcx, opaque_type_values);
379+
343380
// Dump MIR results into a file, if that is enabled. This lets us
344381
// write unit-tests, as well as helping with debugging.
345382
nll::dump_nll_mir(&infcx, body, &regioncx, &opt_closure_req, &borrow_set);

compiler/rustc_borrowck/src/nll.rs

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use std::path::PathBuf;
55
use std::rc::Rc;
66
use std::str::FromStr;
77

8-
use polonius_engine::{Algorithm, Output};
8+
use polonius_engine::{Algorithm, AllFacts, Output};
9+
use rustc_data_structures::frozen::Frozen;
910
use rustc_index::IndexSlice;
1011
use rustc_middle::mir::pretty::{PrettyPrintMirOptions, dump_mir_with_options};
1112
use rustc_middle::mir::{Body, PassWhere, Promoted, create_dump_file, dump_enabled, dump_mir};
@@ -18,14 +19,16 @@ use rustc_span::sym;
1819
use tracing::{debug, instrument};
1920

2021
use crate::borrow_set::BorrowSet;
22+
use crate::consumers::RustcFacts;
2123
use crate::diagnostics::RegionErrors;
2224
use crate::handle_placeholders::compute_sccs_applying_placeholder_outlives_constraints;
23-
use crate::polonius::PoloniusDiagnosticsContext;
2425
use crate::polonius::legacy::{
2526
PoloniusFacts, PoloniusFactsExt, PoloniusLocationTable, PoloniusOutput,
2627
};
28+
use crate::polonius::{PoloniusContext, PoloniusDiagnosticsContext};
2729
use crate::region_infer::RegionInferenceContext;
28-
use crate::type_check::{self, MirTypeckResults};
30+
use crate::type_check::MirTypeckRegionConstraints;
31+
use crate::type_check::free_region_relations::UniversalRegionRelations;
2932
use crate::universal_regions::UniversalRegions;
3033
use crate::{
3134
BorrowCheckRootCtxt, BorrowckInferCtxt, ClosureOutlivesSubject, ClosureRegionRequirements,
@@ -76,41 +79,18 @@ pub(crate) fn replace_regions_in_mir<'tcx>(
7679
pub(crate) fn compute_regions<'tcx>(
7780
root_cx: &mut BorrowCheckRootCtxt<'tcx>,
7881
infcx: &BorrowckInferCtxt<'tcx>,
79-
universal_regions: UniversalRegions<'tcx>,
8082
body: &Body<'tcx>,
81-
promoted: &IndexSlice<Promoted, Body<'tcx>>,
8283
location_table: &PoloniusLocationTable,
8384
move_data: &MoveData<'tcx>,
8485
borrow_set: &BorrowSet<'tcx>,
86+
location_map: Rc<DenseLocationMap>,
87+
universal_region_relations: Frozen<UniversalRegionRelations<'tcx>>,
88+
constraints: MirTypeckRegionConstraints<'tcx>,
89+
mut polonius_facts: Option<AllFacts<RustcFacts>>,
90+
polonius_context: Option<PoloniusContext>,
8591
) -> NllOutput<'tcx> {
86-
let is_polonius_legacy_enabled = infcx.tcx.sess.opts.unstable_opts.polonius.is_legacy_enabled();
87-
let polonius_input = root_cx.consumer.as_ref().map_or(false, |c| c.polonius_input())
88-
|| is_polonius_legacy_enabled;
8992
let polonius_output = root_cx.consumer.as_ref().map_or(false, |c| c.polonius_output())
90-
|| is_polonius_legacy_enabled;
91-
let mut polonius_facts =
92-
(polonius_input || PoloniusFacts::enabled(infcx.tcx)).then_some(PoloniusFacts::default());
93-
94-
let location_map = Rc::new(DenseLocationMap::new(body));
95-
96-
// Run the MIR type-checker.
97-
let MirTypeckResults {
98-
constraints,
99-
universal_region_relations,
100-
opaque_type_values,
101-
polonius_context,
102-
} = type_check::type_check(
103-
root_cx,
104-
infcx,
105-
body,
106-
promoted,
107-
universal_regions,
108-
location_table,
109-
borrow_set,
110-
&mut polonius_facts,
111-
move_data,
112-
Rc::clone(&location_map),
113-
);
93+
|| infcx.tcx.sess.opts.unstable_opts.polonius.is_legacy_enabled();
11494

11595
let lowered_constraints = compute_sccs_applying_placeholder_outlives_constraints(
11696
constraints,
@@ -173,8 +153,6 @@ pub(crate) fn compute_regions<'tcx>(
173153
infcx.set_tainted_by_errors(guar);
174154
}
175155

176-
regioncx.infer_opaque_types(root_cx, infcx, opaque_type_values);
177-
178156
NllOutput {
179157
regioncx,
180158
polonius_input: polonius_facts.map(Box::new),

0 commit comments

Comments
 (0)