rename AllFacts
to PoloniusFacts
This is another strangely named struct (and associated fields) that is hard to see was related to datalog polonius.
This commit is contained in:
parent
3a1a621115
commit
36ea00c20d
9 changed files with 47 additions and 45 deletions
|
@ -11,7 +11,7 @@ pub use super::dataflow::{BorrowIndex, Borrows, calculate_borrows_out_of_scope_a
|
||||||
pub use super::place_ext::PlaceExt;
|
pub use super::place_ext::PlaceExt;
|
||||||
pub use super::places_conflict::{PlaceConflictBias, places_conflict};
|
pub use super::places_conflict::{PlaceConflictBias, places_conflict};
|
||||||
pub use super::polonius::legacy::{
|
pub use super::polonius::legacy::{
|
||||||
AllFacts as PoloniusInput, PoloniusLocationTable, PoloniusOutput, PoloniusRegionVid,
|
PoloniusFacts as PoloniusInput, PoloniusLocationTable, PoloniusOutput, PoloniusRegionVid,
|
||||||
RichLocation, RustcFacts,
|
RichLocation, RustcFacts,
|
||||||
};
|
};
|
||||||
pub use super::region_infer::RegionInferenceContext;
|
pub use super::region_infer::RegionInferenceContext;
|
||||||
|
|
|
@ -28,7 +28,9 @@ use crate::borrow_set::BorrowSet;
|
||||||
use crate::consumers::ConsumerOptions;
|
use crate::consumers::ConsumerOptions;
|
||||||
use crate::diagnostics::{BorrowckDiagnosticsBuffer, RegionErrors};
|
use crate::diagnostics::{BorrowckDiagnosticsBuffer, RegionErrors};
|
||||||
use crate::polonius::LocalizedOutlivesConstraintSet;
|
use crate::polonius::LocalizedOutlivesConstraintSet;
|
||||||
use crate::polonius::legacy::{AllFacts, AllFactsExt, PoloniusLocationTable, PoloniusOutput};
|
use crate::polonius::legacy::{
|
||||||
|
PoloniusFacts, PoloniusFactsExt, PoloniusLocationTable, PoloniusOutput,
|
||||||
|
};
|
||||||
use crate::region_infer::RegionInferenceContext;
|
use crate::region_infer::RegionInferenceContext;
|
||||||
use crate::type_check::{self, MirTypeckResults};
|
use crate::type_check::{self, MirTypeckResults};
|
||||||
use crate::universal_regions::UniversalRegions;
|
use crate::universal_regions::UniversalRegions;
|
||||||
|
@ -39,7 +41,7 @@ use crate::{BorrowckInferCtxt, polonius, renumber};
|
||||||
pub(crate) struct NllOutput<'tcx> {
|
pub(crate) struct NllOutput<'tcx> {
|
||||||
pub regioncx: RegionInferenceContext<'tcx>,
|
pub regioncx: RegionInferenceContext<'tcx>,
|
||||||
pub opaque_type_values: FxIndexMap<LocalDefId, OpaqueHiddenType<'tcx>>,
|
pub opaque_type_values: FxIndexMap<LocalDefId, OpaqueHiddenType<'tcx>>,
|
||||||
pub polonius_input: Option<Box<AllFacts>>,
|
pub polonius_input: Option<Box<PoloniusFacts>>,
|
||||||
pub polonius_output: Option<Box<PoloniusOutput>>,
|
pub polonius_output: Option<Box<PoloniusOutput>>,
|
||||||
pub opt_closure_req: Option<ClosureRegionRequirements<'tcx>>,
|
pub opt_closure_req: Option<ClosureRegionRequirements<'tcx>>,
|
||||||
pub nll_errors: RegionErrors<'tcx>,
|
pub nll_errors: RegionErrors<'tcx>,
|
||||||
|
@ -91,8 +93,8 @@ pub(crate) fn compute_regions<'a, 'tcx>(
|
||||||
|| is_polonius_legacy_enabled;
|
|| is_polonius_legacy_enabled;
|
||||||
let polonius_output = consumer_options.map(|c| c.polonius_output()).unwrap_or_default()
|
let polonius_output = consumer_options.map(|c| c.polonius_output()).unwrap_or_default()
|
||||||
|| is_polonius_legacy_enabled;
|
|| is_polonius_legacy_enabled;
|
||||||
let mut all_facts =
|
let mut polonius_facts =
|
||||||
(polonius_input || AllFacts::enabled(infcx.tcx)).then_some(AllFacts::default());
|
(polonius_input || PoloniusFacts::enabled(infcx.tcx)).then_some(PoloniusFacts::default());
|
||||||
|
|
||||||
let location_map = Rc::new(DenseLocationMap::new(body));
|
let location_map = Rc::new(DenseLocationMap::new(body));
|
||||||
|
|
||||||
|
@ -109,7 +111,7 @@ pub(crate) fn compute_regions<'a, 'tcx>(
|
||||||
universal_regions,
|
universal_regions,
|
||||||
location_table,
|
location_table,
|
||||||
borrow_set,
|
borrow_set,
|
||||||
&mut all_facts,
|
&mut polonius_facts,
|
||||||
flow_inits,
|
flow_inits,
|
||||||
move_data,
|
move_data,
|
||||||
Rc::clone(&location_map),
|
Rc::clone(&location_map),
|
||||||
|
@ -122,7 +124,7 @@ pub(crate) fn compute_regions<'a, 'tcx>(
|
||||||
|
|
||||||
// If requested, emit legacy polonius facts.
|
// If requested, emit legacy polonius facts.
|
||||||
polonius::legacy::emit_facts(
|
polonius::legacy::emit_facts(
|
||||||
&mut all_facts,
|
&mut polonius_facts,
|
||||||
infcx.tcx,
|
infcx.tcx,
|
||||||
location_table,
|
location_table,
|
||||||
body,
|
body,
|
||||||
|
@ -147,13 +149,13 @@ pub(crate) fn compute_regions<'a, 'tcx>(
|
||||||
});
|
});
|
||||||
|
|
||||||
// If requested: dump NLL facts, and run legacy polonius analysis.
|
// If requested: dump NLL facts, and run legacy polonius analysis.
|
||||||
let polonius_output = all_facts.as_ref().and_then(|all_facts| {
|
let polonius_output = polonius_facts.as_ref().and_then(|polonius_facts| {
|
||||||
if infcx.tcx.sess.opts.unstable_opts.nll_facts {
|
if infcx.tcx.sess.opts.unstable_opts.nll_facts {
|
||||||
let def_id = body.source.def_id();
|
let def_id = body.source.def_id();
|
||||||
let def_path = infcx.tcx.def_path(def_id);
|
let def_path = infcx.tcx.def_path(def_id);
|
||||||
let dir_path = PathBuf::from(&infcx.tcx.sess.opts.unstable_opts.nll_facts_dir)
|
let dir_path = PathBuf::from(&infcx.tcx.sess.opts.unstable_opts.nll_facts_dir)
|
||||||
.join(def_path.to_filename_friendly_no_crate());
|
.join(def_path.to_filename_friendly_no_crate());
|
||||||
all_facts.write_to_dir(dir_path, location_table).unwrap();
|
polonius_facts.write_to_dir(dir_path, location_table).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
if polonius_output {
|
if polonius_output {
|
||||||
|
@ -162,7 +164,7 @@ pub(crate) fn compute_regions<'a, 'tcx>(
|
||||||
let algorithm = Algorithm::from_str(&algorithm).unwrap();
|
let algorithm = Algorithm::from_str(&algorithm).unwrap();
|
||||||
debug!("compute_regions: using polonius algorithm {:?}", algorithm);
|
debug!("compute_regions: using polonius algorithm {:?}", algorithm);
|
||||||
let _prof_timer = infcx.tcx.prof.generic_activity("polonius_analysis");
|
let _prof_timer = infcx.tcx.prof.generic_activity("polonius_analysis");
|
||||||
Some(Box::new(Output::compute(all_facts, algorithm, false)))
|
Some(Box::new(Output::compute(polonius_facts, algorithm, false)))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
@ -182,7 +184,7 @@ pub(crate) fn compute_regions<'a, 'tcx>(
|
||||||
NllOutput {
|
NllOutput {
|
||||||
regioncx,
|
regioncx,
|
||||||
opaque_type_values: remapped_opaque_tys,
|
opaque_type_values: remapped_opaque_tys,
|
||||||
polonius_input: all_facts.map(Box::new),
|
polonius_input: polonius_facts.map(Box::new),
|
||||||
polonius_output,
|
polonius_output,
|
||||||
opt_closure_req: closure_region_requirements,
|
opt_closure_req: closure_region_requirements,
|
||||||
nll_errors,
|
nll_errors,
|
||||||
|
|
|
@ -4,14 +4,14 @@ use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_mir_dataflow::move_paths::{LookupResult, MoveData};
|
use rustc_mir_dataflow::move_paths::{LookupResult, MoveData};
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use super::{AllFacts, LocationIndex, PoloniusLocationTable};
|
use super::{LocationIndex, PoloniusFacts, PoloniusLocationTable};
|
||||||
use crate::def_use::{self, DefUse};
|
use crate::def_use::{self, DefUse};
|
||||||
use crate::universal_regions::UniversalRegions;
|
use crate::universal_regions::UniversalRegions;
|
||||||
|
|
||||||
/// Emit polonius facts for variable defs, uses, drops, and path accesses.
|
/// Emit polonius facts for variable defs, uses, drops, and path accesses.
|
||||||
pub(crate) fn emit_access_facts<'tcx>(
|
pub(crate) fn emit_access_facts<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
facts: &mut AllFacts,
|
facts: &mut PoloniusFacts,
|
||||||
body: &Body<'tcx>,
|
body: &Body<'tcx>,
|
||||||
location_table: &PoloniusLocationTable,
|
location_table: &PoloniusLocationTable,
|
||||||
move_data: &MoveData<'tcx>,
|
move_data: &MoveData<'tcx>,
|
||||||
|
@ -31,7 +31,7 @@ pub(crate) fn emit_access_facts<'tcx>(
|
||||||
|
|
||||||
/// MIR visitor extracting point-wise facts about accesses.
|
/// MIR visitor extracting point-wise facts about accesses.
|
||||||
struct AccessFactsExtractor<'a, 'tcx> {
|
struct AccessFactsExtractor<'a, 'tcx> {
|
||||||
facts: &'a mut AllFacts,
|
facts: &'a mut PoloniusFacts,
|
||||||
move_data: &'a MoveData<'tcx>,
|
move_data: &'a MoveData<'tcx>,
|
||||||
location_table: &'a PoloniusLocationTable,
|
location_table: &'a PoloniusLocationTable,
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use std::fs::{self, File};
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use polonius_engine::{AllFacts as PoloniusFacts, Atom, Output};
|
use polonius_engine::{AllFacts, Atom, Output};
|
||||||
use rustc_macros::extension;
|
use rustc_macros::extension;
|
||||||
use rustc_middle::mir::Local;
|
use rustc_middle::mir::Local;
|
||||||
use rustc_middle::ty::{RegionVid, TyCtxt};
|
use rustc_middle::ty::{RegionVid, TyCtxt};
|
||||||
|
@ -49,11 +49,11 @@ impl polonius_engine::FactTypes for RustcFacts {
|
||||||
type Path = MovePathIndex;
|
type Path = MovePathIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type AllFacts = PoloniusFacts<RustcFacts>;
|
pub type PoloniusFacts = AllFacts<RustcFacts>;
|
||||||
|
|
||||||
#[extension(pub(crate) trait AllFactsExt)]
|
#[extension(pub(crate) trait PoloniusFactsExt)]
|
||||||
impl AllFacts {
|
impl PoloniusFacts {
|
||||||
/// Returns `true` if there is a need to gather `AllFacts` given the
|
/// Returns `true` if there is a need to gather `PoloniusFacts` given the
|
||||||
/// current `-Z` flags.
|
/// current `-Z` flags.
|
||||||
fn enabled(tcx: TyCtxt<'_>) -> bool {
|
fn enabled(tcx: TyCtxt<'_>) -> bool {
|
||||||
tcx.sess.opts.unstable_opts.nll_facts
|
tcx.sess.opts.unstable_opts.nll_facts
|
||||||
|
|
|
@ -11,7 +11,7 @@ use rustc_middle::mir::{
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use super::{AllFacts, PoloniusLocationTable};
|
use super::{PoloniusFacts, PoloniusLocationTable};
|
||||||
use crate::borrow_set::BorrowSet;
|
use crate::borrow_set::BorrowSet;
|
||||||
use crate::path_utils::*;
|
use crate::path_utils::*;
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -22,7 +22,7 @@ use crate::{
|
||||||
/// Emit `loan_invalidated_at` facts.
|
/// Emit `loan_invalidated_at` facts.
|
||||||
pub(super) fn emit_loan_invalidations<'tcx>(
|
pub(super) fn emit_loan_invalidations<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
facts: &mut AllFacts,
|
facts: &mut PoloniusFacts,
|
||||||
body: &Body<'tcx>,
|
body: &Body<'tcx>,
|
||||||
location_table: &PoloniusLocationTable,
|
location_table: &PoloniusLocationTable,
|
||||||
borrow_set: &BorrowSet<'tcx>,
|
borrow_set: &BorrowSet<'tcx>,
|
||||||
|
@ -35,7 +35,7 @@ pub(super) fn emit_loan_invalidations<'tcx>(
|
||||||
|
|
||||||
struct LoanInvalidationsGenerator<'a, 'tcx> {
|
struct LoanInvalidationsGenerator<'a, 'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
facts: &'a mut AllFacts,
|
facts: &'a mut PoloniusFacts,
|
||||||
body: &'a Body<'tcx>,
|
body: &'a Body<'tcx>,
|
||||||
location_table: &'a PoloniusLocationTable,
|
location_table: &'a PoloniusLocationTable,
|
||||||
dominators: &'a Dominators<BasicBlock>,
|
dominators: &'a Dominators<BasicBlock>,
|
||||||
|
|
|
@ -6,14 +6,14 @@ use rustc_middle::mir::{
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use super::{AllFacts, PoloniusLocationTable};
|
use super::{PoloniusFacts, PoloniusLocationTable};
|
||||||
use crate::borrow_set::BorrowSet;
|
use crate::borrow_set::BorrowSet;
|
||||||
use crate::places_conflict;
|
use crate::places_conflict;
|
||||||
|
|
||||||
/// Emit `loan_killed_at` and `cfg_edge` facts at the same time.
|
/// Emit `loan_killed_at` and `cfg_edge` facts at the same time.
|
||||||
pub(super) fn emit_loan_kills<'tcx>(
|
pub(super) fn emit_loan_kills<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
facts: &mut AllFacts,
|
facts: &mut PoloniusFacts,
|
||||||
body: &Body<'tcx>,
|
body: &Body<'tcx>,
|
||||||
location_table: &PoloniusLocationTable,
|
location_table: &PoloniusLocationTable,
|
||||||
borrow_set: &BorrowSet<'tcx>,
|
borrow_set: &BorrowSet<'tcx>,
|
||||||
|
@ -26,7 +26,7 @@ pub(super) fn emit_loan_kills<'tcx>(
|
||||||
|
|
||||||
struct LoanKillsGenerator<'a, 'tcx> {
|
struct LoanKillsGenerator<'a, 'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
facts: &'a mut AllFacts,
|
facts: &'a mut PoloniusFacts,
|
||||||
location_table: &'a PoloniusLocationTable,
|
location_table: &'a PoloniusLocationTable,
|
||||||
borrow_set: &'a BorrowSet<'tcx>,
|
borrow_set: &'a BorrowSet<'tcx>,
|
||||||
body: &'a Body<'tcx>,
|
body: &'a Body<'tcx>,
|
||||||
|
|
|
@ -36,7 +36,7 @@ pub use self::facts::*;
|
||||||
///
|
///
|
||||||
/// The rest of the facts are emitted during typeck and liveness.
|
/// The rest of the facts are emitted during typeck and liveness.
|
||||||
pub(crate) fn emit_facts<'tcx>(
|
pub(crate) fn emit_facts<'tcx>(
|
||||||
all_facts: &mut Option<AllFacts>,
|
facts: &mut Option<PoloniusFacts>,
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
location_table: &PoloniusLocationTable,
|
location_table: &PoloniusLocationTable,
|
||||||
body: &Body<'tcx>,
|
body: &Body<'tcx>,
|
||||||
|
@ -45,7 +45,7 @@ pub(crate) fn emit_facts<'tcx>(
|
||||||
universal_region_relations: &UniversalRegionRelations<'tcx>,
|
universal_region_relations: &UniversalRegionRelations<'tcx>,
|
||||||
constraints: &MirTypeckRegionConstraints<'tcx>,
|
constraints: &MirTypeckRegionConstraints<'tcx>,
|
||||||
) {
|
) {
|
||||||
let Some(facts) = all_facts else {
|
let Some(facts) = facts else {
|
||||||
// We don't do anything if there are no facts to fill.
|
// We don't do anything if there are no facts to fill.
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
@ -67,7 +67,7 @@ pub(crate) fn emit_facts<'tcx>(
|
||||||
|
|
||||||
/// Emit facts needed for move/init analysis: moves and assignments.
|
/// Emit facts needed for move/init analysis: moves and assignments.
|
||||||
fn emit_move_facts(
|
fn emit_move_facts(
|
||||||
facts: &mut AllFacts,
|
facts: &mut PoloniusFacts,
|
||||||
body: &Body<'_>,
|
body: &Body<'_>,
|
||||||
location_table: &PoloniusLocationTable,
|
location_table: &PoloniusLocationTable,
|
||||||
move_data: &MoveData<'_>,
|
move_data: &MoveData<'_>,
|
||||||
|
@ -139,7 +139,7 @@ fn emit_move_facts(
|
||||||
|
|
||||||
/// Emit universal regions facts, and their relations.
|
/// Emit universal regions facts, and their relations.
|
||||||
fn emit_universal_region_facts(
|
fn emit_universal_region_facts(
|
||||||
facts: &mut AllFacts,
|
facts: &mut PoloniusFacts,
|
||||||
borrow_set: &BorrowSet<'_>,
|
borrow_set: &BorrowSet<'_>,
|
||||||
universal_region_relations: &UniversalRegionRelations<'_>,
|
universal_region_relations: &UniversalRegionRelations<'_>,
|
||||||
) {
|
) {
|
||||||
|
@ -187,10 +187,10 @@ pub(crate) fn emit_drop_facts<'tcx>(
|
||||||
local: Local,
|
local: Local,
|
||||||
kind: &GenericArg<'tcx>,
|
kind: &GenericArg<'tcx>,
|
||||||
universal_regions: &UniversalRegions<'tcx>,
|
universal_regions: &UniversalRegions<'tcx>,
|
||||||
all_facts: &mut Option<AllFacts>,
|
facts: &mut Option<PoloniusFacts>,
|
||||||
) {
|
) {
|
||||||
debug!("emit_drop_facts(local={:?}, kind={:?}", local, kind);
|
debug!("emit_drop_facts(local={:?}, kind={:?}", local, kind);
|
||||||
let Some(facts) = all_facts.as_mut() else { return };
|
let Some(facts) = facts.as_mut() else { return };
|
||||||
let _prof_timer = tcx.prof.generic_activity("polonius_fact_generation");
|
let _prof_timer = tcx.prof.generic_activity("polonius_fact_generation");
|
||||||
tcx.for_each_free_region(kind, |drop_live_region| {
|
tcx.for_each_free_region(kind, |drop_live_region| {
|
||||||
let region_vid = universal_regions.to_region_vid(drop_live_region);
|
let region_vid = universal_regions.to_region_vid(drop_live_region);
|
||||||
|
@ -201,7 +201,7 @@ pub(crate) fn emit_drop_facts<'tcx>(
|
||||||
/// Emit facts about the outlives constraints: the `subset` base relation, i.e. not a transitive
|
/// Emit facts about the outlives constraints: the `subset` base relation, i.e. not a transitive
|
||||||
/// closure.
|
/// closure.
|
||||||
fn emit_outlives_facts<'tcx>(
|
fn emit_outlives_facts<'tcx>(
|
||||||
facts: &mut AllFacts,
|
facts: &mut PoloniusFacts,
|
||||||
location_table: &PoloniusLocationTable,
|
location_table: &PoloniusLocationTable,
|
||||||
constraints: &MirTypeckRegionConstraints<'tcx>,
|
constraints: &MirTypeckRegionConstraints<'tcx>,
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -213,14 +213,14 @@ impl<'a, 'typeck, 'b, 'tcx> LivenessResults<'a, 'typeck, 'b, 'tcx> {
|
||||||
fn add_extra_drop_facts(&mut self, relevant_live_locals: &[Local]) {
|
fn add_extra_drop_facts(&mut self, relevant_live_locals: &[Local]) {
|
||||||
// This collect is more necessary than immediately apparent
|
// This collect is more necessary than immediately apparent
|
||||||
// because these facts go into `add_drop_live_facts_for()`,
|
// because these facts go into `add_drop_live_facts_for()`,
|
||||||
// which also writes to `all_facts`, and so this is genuinely
|
// which also writes to `polonius_facts`, and so this is genuinely
|
||||||
// a simultaneous overlapping mutable borrow.
|
// a simultaneous overlapping mutable borrow.
|
||||||
// FIXME for future hackers: investigate whether this is
|
// FIXME for future hackers: investigate whether this is
|
||||||
// actually necessary; these facts come from Polonius
|
// actually necessary; these facts come from Polonius
|
||||||
// and probably maybe plausibly does not need to go back in.
|
// and probably maybe plausibly does not need to go back in.
|
||||||
// It may be necessary to just pick out the parts of
|
// It may be necessary to just pick out the parts of
|
||||||
// `add_drop_live_facts_for()` that make sense.
|
// `add_drop_live_facts_for()` that make sense.
|
||||||
let Some(facts) = self.cx.typeck.all_facts.as_ref() else { return };
|
let Some(facts) = self.cx.typeck.polonius_facts.as_ref() else { return };
|
||||||
let facts_to_add: Vec<_> = {
|
let facts_to_add: Vec<_> = {
|
||||||
let relevant_live_locals: FxIndexSet<_> =
|
let relevant_live_locals: FxIndexSet<_> =
|
||||||
relevant_live_locals.iter().copied().collect();
|
relevant_live_locals.iter().copied().collect();
|
||||||
|
@ -583,7 +583,7 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
|
||||||
dropped_local,
|
dropped_local,
|
||||||
&kind,
|
&kind,
|
||||||
self.typeck.universal_regions,
|
self.typeck.universal_regions,
|
||||||
self.typeck.all_facts,
|
self.typeck.polonius_facts,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ use crate::constraints::{OutlivesConstraint, OutlivesConstraintSet};
|
||||||
use crate::diagnostics::UniverseInfo;
|
use crate::diagnostics::UniverseInfo;
|
||||||
use crate::member_constraints::MemberConstraintSet;
|
use crate::member_constraints::MemberConstraintSet;
|
||||||
use crate::polonius::PoloniusContext;
|
use crate::polonius::PoloniusContext;
|
||||||
use crate::polonius::legacy::{AllFacts, PoloniusLocationTable};
|
use crate::polonius::legacy::{PoloniusFacts, PoloniusLocationTable};
|
||||||
use crate::region_infer::TypeTest;
|
use crate::region_infer::TypeTest;
|
||||||
use crate::region_infer::values::{LivenessValues, PlaceholderIndex, PlaceholderIndices};
|
use crate::region_infer::values::{LivenessValues, PlaceholderIndex, PlaceholderIndices};
|
||||||
use crate::renumber::RegionCtxt;
|
use crate::renumber::RegionCtxt;
|
||||||
|
@ -100,7 +100,7 @@ mod relate_tys;
|
||||||
/// - `universal_regions` -- the universal regions from `body`s function signature
|
/// - `universal_regions` -- the universal regions from `body`s function signature
|
||||||
/// - `location_table` -- for datalog polonius, the map between `Location`s and `RichLocation`s
|
/// - `location_table` -- for datalog polonius, the map between `Location`s and `RichLocation`s
|
||||||
/// - `borrow_set` -- information about borrows occurring in `body`
|
/// - `borrow_set` -- information about borrows occurring in `body`
|
||||||
/// - `all_facts` -- when using Polonius, this is the generated set of Polonius facts
|
/// - `polonius_facts` -- when using Polonius, this is the generated set of Polonius facts
|
||||||
/// - `flow_inits` -- results of a maybe-init dataflow analysis
|
/// - `flow_inits` -- results of a maybe-init dataflow analysis
|
||||||
/// - `move_data` -- move-data constructed when performing the maybe-init dataflow analysis
|
/// - `move_data` -- move-data constructed when performing the maybe-init dataflow analysis
|
||||||
/// - `location_map` -- map between MIR `Location` and `PointIndex`
|
/// - `location_map` -- map between MIR `Location` and `PointIndex`
|
||||||
|
@ -111,7 +111,7 @@ pub(crate) fn type_check<'a, 'tcx>(
|
||||||
universal_regions: UniversalRegions<'tcx>,
|
universal_regions: UniversalRegions<'tcx>,
|
||||||
location_table: &PoloniusLocationTable,
|
location_table: &PoloniusLocationTable,
|
||||||
borrow_set: &BorrowSet<'tcx>,
|
borrow_set: &BorrowSet<'tcx>,
|
||||||
all_facts: &mut Option<AllFacts>,
|
polonius_facts: &mut Option<PoloniusFacts>,
|
||||||
flow_inits: ResultsCursor<'a, 'tcx, MaybeInitializedPlaces<'a, 'tcx>>,
|
flow_inits: ResultsCursor<'a, 'tcx, MaybeInitializedPlaces<'a, 'tcx>>,
|
||||||
move_data: &MoveData<'tcx>,
|
move_data: &MoveData<'tcx>,
|
||||||
location_map: Rc<DenseLocationMap>,
|
location_map: Rc<DenseLocationMap>,
|
||||||
|
@ -165,7 +165,7 @@ pub(crate) fn type_check<'a, 'tcx>(
|
||||||
reported_errors: Default::default(),
|
reported_errors: Default::default(),
|
||||||
universal_regions: &universal_region_relations.universal_regions,
|
universal_regions: &universal_region_relations.universal_regions,
|
||||||
location_table,
|
location_table,
|
||||||
all_facts,
|
polonius_facts,
|
||||||
borrow_set,
|
borrow_set,
|
||||||
constraints: &mut constraints,
|
constraints: &mut constraints,
|
||||||
polonius_context: &mut polonius_context,
|
polonius_context: &mut polonius_context,
|
||||||
|
@ -495,14 +495,14 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
||||||
|
|
||||||
// Use new sets of constraints and closure bounds so that we can
|
// Use new sets of constraints and closure bounds so that we can
|
||||||
// modify their locations.
|
// modify their locations.
|
||||||
let all_facts = &mut None;
|
let polonius_facts = &mut None;
|
||||||
let mut constraints = Default::default();
|
let mut constraints = Default::default();
|
||||||
let mut liveness_constraints =
|
let mut liveness_constraints =
|
||||||
LivenessValues::without_specific_points(Rc::new(DenseLocationMap::new(promoted_body)));
|
LivenessValues::without_specific_points(Rc::new(DenseLocationMap::new(promoted_body)));
|
||||||
// Don't try to add borrow_region facts for the promoted MIR
|
// Don't try to add borrow_region facts for the promoted MIR
|
||||||
|
|
||||||
let mut swap_constraints = |this: &mut Self| {
|
let mut swap_constraints = |this: &mut Self| {
|
||||||
mem::swap(this.typeck.all_facts, all_facts);
|
mem::swap(this.typeck.polonius_facts, polonius_facts);
|
||||||
mem::swap(&mut this.typeck.constraints.outlives_constraints, &mut constraints);
|
mem::swap(&mut this.typeck.constraints.outlives_constraints, &mut constraints);
|
||||||
mem::swap(&mut this.typeck.constraints.liveness_constraints, &mut liveness_constraints);
|
mem::swap(&mut this.typeck.constraints.liveness_constraints, &mut liveness_constraints);
|
||||||
};
|
};
|
||||||
|
@ -561,7 +561,7 @@ struct TypeChecker<'a, 'tcx> {
|
||||||
reported_errors: FxIndexSet<(Ty<'tcx>, Span)>,
|
reported_errors: FxIndexSet<(Ty<'tcx>, Span)>,
|
||||||
universal_regions: &'a UniversalRegions<'tcx>,
|
universal_regions: &'a UniversalRegions<'tcx>,
|
||||||
location_table: &'a PoloniusLocationTable,
|
location_table: &'a PoloniusLocationTable,
|
||||||
all_facts: &'a mut Option<AllFacts>,
|
polonius_facts: &'a mut Option<PoloniusFacts>,
|
||||||
borrow_set: &'a BorrowSet<'tcx>,
|
borrow_set: &'a BorrowSet<'tcx>,
|
||||||
constraints: &'a mut MirTypeckRegionConstraints<'tcx>,
|
constraints: &'a mut MirTypeckRegionConstraints<'tcx>,
|
||||||
/// When using `-Zpolonius=next`, the helper data used to create polonius constraints.
|
/// When using `-Zpolonius=next`, the helper data used to create polonius constraints.
|
||||||
|
@ -2327,18 +2327,18 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
||||||
borrowed_place: &Place<'tcx>,
|
borrowed_place: &Place<'tcx>,
|
||||||
) {
|
) {
|
||||||
// These constraints are only meaningful during borrowck:
|
// These constraints are only meaningful during borrowck:
|
||||||
let Self { borrow_set, location_table, all_facts, constraints, .. } = self;
|
let Self { borrow_set, location_table, polonius_facts, constraints, .. } = self;
|
||||||
|
|
||||||
// In Polonius mode, we also push a `loan_issued_at` fact
|
// In Polonius mode, we also push a `loan_issued_at` fact
|
||||||
// linking the loan to the region (in some cases, though,
|
// linking the loan to the region (in some cases, though,
|
||||||
// there is no loan associated with this borrow expression --
|
// there is no loan associated with this borrow expression --
|
||||||
// that occurs when we are borrowing an unsafe place, for
|
// that occurs when we are borrowing an unsafe place, for
|
||||||
// example).
|
// example).
|
||||||
if let Some(all_facts) = all_facts {
|
if let Some(polonius_facts) = polonius_facts {
|
||||||
let _prof_timer = self.infcx.tcx.prof.generic_activity("polonius_fact_generation");
|
let _prof_timer = self.infcx.tcx.prof.generic_activity("polonius_fact_generation");
|
||||||
if let Some(borrow_index) = borrow_set.get_index_of(&location) {
|
if let Some(borrow_index) = borrow_set.get_index_of(&location) {
|
||||||
let region_vid = borrow_region.as_var();
|
let region_vid = borrow_region.as_var();
|
||||||
all_facts.loan_issued_at.push((
|
polonius_facts.loan_issued_at.push((
|
||||||
region_vid.into(),
|
region_vid.into(),
|
||||||
borrow_index,
|
borrow_index,
|
||||||
location_table.mid_index(location),
|
location_table.mid_index(location),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue