1
Fork 0

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:
Rémy Rakic 2025-01-08 13:23:54 +00:00
parent 3a1a621115
commit 36ea00c20d
9 changed files with 47 additions and 45 deletions

View file

@ -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;

View file

@ -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,

View file

@ -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,
} }

View file

@ -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

View file

@ -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>,

View file

@ -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>,

View file

@ -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>,
) { ) {

View file

@ -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,
); );
} }
} }

View file

@ -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),