diff --git a/compiler/rustc_borrowck/src/lib.rs b/compiler/rustc_borrowck/src/lib.rs index 46e5356ad2c..d711a53565d 100644 --- a/compiler/rustc_borrowck/src/lib.rs +++ b/compiler/rustc_borrowck/src/lib.rs @@ -70,13 +70,13 @@ mod dataflow; mod def_use; mod diagnostics; mod facts; -mod invalidation; mod location; mod member_constraints; mod nll; mod path_utils; mod place_ext; mod places_conflict; +mod polonius; mod prefixes; mod region_infer; mod renumber; diff --git a/compiler/rustc_borrowck/src/nll.rs b/compiler/rustc_borrowck/src/nll.rs index 705e56ea984..0e1f48902e3 100644 --- a/compiler/rustc_borrowck/src/nll.rs +++ b/compiler/rustc_borrowck/src/nll.rs @@ -20,16 +20,14 @@ use std::path::PathBuf; use std::rc::Rc; use std::str::FromStr; -mod polonius; - use crate::{ borrow_set::BorrowSet, constraint_generation, consumers::ConsumerOptions, diagnostics::RegionErrors, facts::{AllFacts, AllFactsExt, RustcFacts}, - invalidation, location::LocationTable, + polonius, region_infer::{values::RegionValueElements, RegionInferenceContext}, renumber, type_check::{self, MirTypeckRegionConstraints, MirTypeckResults}, @@ -176,7 +174,13 @@ pub(crate) fn compute_regions<'cx, 'tcx>( ); // Generate various additional constraints. - invalidation::generate_invalidates(infcx.tcx, &mut all_facts, location_table, body, borrow_set); + polonius::emit_loan_invalidations_facts( + infcx.tcx, + &mut all_facts, + location_table, + body, + borrow_set, + ); let def_id = body.source.def_id(); diff --git a/compiler/rustc_borrowck/src/invalidation.rs b/compiler/rustc_borrowck/src/polonius/invalidation.rs similarity index 96% rename from compiler/rustc_borrowck/src/invalidation.rs rename to compiler/rustc_borrowck/src/polonius/invalidation.rs index a3db101311f..43119a97bee 100644 --- a/compiler/rustc_borrowck/src/invalidation.rs +++ b/compiler/rustc_borrowck/src/polonius/invalidation.rs @@ -14,31 +14,25 @@ use crate::{ ReadOrWrite, Reservation, Shallow, Write, WriteKind, }; -pub(super) fn generate_invalidates<'tcx>( +/// Emit `loan_invalidated_at` facts. +pub(super) fn emit_loan_invalidations<'tcx>( tcx: TyCtxt<'tcx>, - all_facts: &mut Option, + all_facts: &mut AllFacts, location_table: &LocationTable, body: &Body<'tcx>, borrow_set: &BorrowSet<'tcx>, ) { - if all_facts.is_none() { - // Nothing to do if we don't have any facts - return; - } - - if let Some(all_facts) = all_facts { - let _prof_timer = tcx.prof.generic_activity("polonius_fact_generation"); - let dominators = body.basic_blocks.dominators(); - let mut ig = InvalidationGenerator { - all_facts, - borrow_set, - tcx, - location_table, - body: body, - dominators, - }; - ig.visit_body(body); - } + let _prof_timer = tcx.prof.generic_activity("polonius_fact_generation"); + let dominators = body.basic_blocks.dominators(); + let mut ig = InvalidationGenerator { + all_facts, + borrow_set, + tcx, + location_table, + body: body, + dominators, + }; + ig.visit_body(body); } struct InvalidationGenerator<'cx, 'tcx> { diff --git a/compiler/rustc_borrowck/src/nll/polonius.rs b/compiler/rustc_borrowck/src/polonius/mod.rs similarity index 91% rename from compiler/rustc_borrowck/src/nll/polonius.rs rename to compiler/rustc_borrowck/src/polonius/mod.rs index d493bead772..887c5fac16b 100644 --- a/compiler/rustc_borrowck/src/nll/polonius.rs +++ b/compiler/rustc_borrowck/src/polonius/mod.rs @@ -4,6 +4,7 @@ //! parity. use rustc_middle::mir::{Body, LocalKind, Location, START_BLOCK}; +use rustc_middle::ty::TyCtxt; use rustc_mir_dataflow::move_paths::{InitKind, InitLocation, MoveData}; use crate::borrow_set::BorrowSet; @@ -12,6 +13,8 @@ use crate::location::LocationTable; use crate::type_check::free_region_relations::UniversalRegionRelations; use crate::universal_regions::UniversalRegions; +mod invalidation; + /// Emit facts needed for move/init analysis: moves and assignments. pub(crate) fn emit_move_facts( all_facts: &mut AllFacts, @@ -126,3 +129,19 @@ pub(crate) fn emit_universal_region_facts( } } } + +/// Emit facts about loan invalidations +pub(crate) fn emit_loan_invalidations_facts<'tcx>( + tcx: TyCtxt<'tcx>, + all_facts: &mut Option, + location_table: &LocationTable, + body: &Body<'tcx>, + borrow_set: &BorrowSet<'tcx>, +) { + let Some(all_facts) = all_facts else { + // Nothing to do if we don't have any facts to fill + return; + }; + + invalidation::emit_loan_invalidations(tcx, all_facts, location_table, body, borrow_set); +}