Remove RegionckMode in favor of calling new skip_region_resolution
This commit is contained in:
parent
c570ab5a0b
commit
d716245aa6
8 changed files with 52 additions and 80 deletions
|
@ -7,7 +7,6 @@ use crate::infer::region_constraints::VarInfos;
|
|||
use crate::infer::region_constraints::VerifyBound;
|
||||
use crate::infer::RegionRelations;
|
||||
use crate::infer::RegionVariableOrigin;
|
||||
use crate::infer::RegionckMode;
|
||||
use crate::infer::SubregionOrigin;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_data_structures::graph::implementation::{
|
||||
|
@ -33,32 +32,23 @@ pub(crate) fn resolve<'tcx>(
|
|||
region_rels: &RegionRelations<'_, 'tcx>,
|
||||
var_infos: VarInfos,
|
||||
data: RegionConstraintData<'tcx>,
|
||||
mode: RegionckMode,
|
||||
) -> (LexicalRegionResolutions<'tcx>, Vec<RegionResolutionError<'tcx>>) {
|
||||
let mut errors = vec![];
|
||||
let mut resolver = LexicalResolver { region_rels, var_infos, data };
|
||||
match mode {
|
||||
RegionckMode::Solve => {
|
||||
let values = resolver.infer_variable_values(&mut errors);
|
||||
(values, errors)
|
||||
}
|
||||
RegionckMode::Erase => {
|
||||
// Skip region inference entirely.
|
||||
(resolver.erased_data(region_rels.tcx), Vec::new())
|
||||
}
|
||||
}
|
||||
let values = resolver.infer_variable_values(&mut errors);
|
||||
(values, errors)
|
||||
}
|
||||
|
||||
/// Contains the result of lexical region resolution. Offers methods
|
||||
/// to lookup up the final value of a region variable.
|
||||
#[derive(Clone)]
|
||||
pub struct LexicalRegionResolutions<'tcx> {
|
||||
values: IndexVec<RegionVid, VarValue<'tcx>>,
|
||||
error_region: ty::Region<'tcx>,
|
||||
pub(crate) values: IndexVec<RegionVid, VarValue<'tcx>>,
|
||||
pub(crate) error_region: ty::Region<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
enum VarValue<'tcx> {
|
||||
pub(crate) enum VarValue<'tcx> {
|
||||
Value(Region<'tcx>),
|
||||
ErrorValue,
|
||||
}
|
||||
|
@ -162,19 +152,6 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
/// An erased version of the lexical region resolutions. Used when we're
|
||||
/// erasing regions and suppressing errors: in item bodies with
|
||||
/// `-Zborrowck=mir`.
|
||||
fn erased_data(&self, tcx: TyCtxt<'tcx>) -> LexicalRegionResolutions<'tcx> {
|
||||
LexicalRegionResolutions {
|
||||
error_region: tcx.lifetimes.re_static,
|
||||
values: IndexVec::from_elem_n(
|
||||
VarValue::Value(tcx.lifetimes.re_erased),
|
||||
self.num_vars(),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn dump_constraints(&self, free_regions: &RegionRelations<'_, 'tcx>) {
|
||||
debug!("----() Start constraint listing (context={:?}) ()----", free_regions.context);
|
||||
for (idx, (constraint, _)) in self.data.constraints.iter().enumerate() {
|
||||
|
|
|
@ -84,20 +84,6 @@ pub(crate) type UnificationTable<'a, 'tcx, T> = ut::UnificationTable<
|
|||
ut::InPlace<T, &'a mut ut::UnificationStorage<T>, &'a mut InferCtxtUndoLogs<'tcx>>,
|
||||
>;
|
||||
|
||||
/// How we should handle region solving.
|
||||
///
|
||||
/// This is used so that the region values inferred by HIR region solving are
|
||||
/// not exposed, and so that we can avoid doing work in HIR typeck that MIR
|
||||
/// typeck will also do.
|
||||
#[derive(Copy, Clone, Debug, Default)]
|
||||
pub enum RegionckMode {
|
||||
/// The default mode: report region errors, don't erase regions.
|
||||
#[default]
|
||||
Solve,
|
||||
/// Erase the results of region after solving.
|
||||
Erase,
|
||||
}
|
||||
|
||||
/// This type contains all the things within `InferCtxt` that sit within a
|
||||
/// `RefCell` and are involved with taking/rolling back snapshots. Snapshot
|
||||
/// operations are hot enough that we want only one call to `borrow_mut` per
|
||||
|
@ -1248,6 +1234,33 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
self.tainted_by_errors_flag.set(true)
|
||||
}
|
||||
|
||||
pub fn skip_region_resolution(&self) {
|
||||
let (var_infos, _) = {
|
||||
let mut inner = self.inner.borrow_mut();
|
||||
let inner = &mut *inner;
|
||||
// Note: `inner.region_obligations` may not be empty, because we
|
||||
// didn't necessarily call `process_registered_region_obligations`.
|
||||
// This is okay, because that doesn't introduce new vars.
|
||||
inner
|
||||
.region_constraint_storage
|
||||
.take()
|
||||
.expect("regions already resolved")
|
||||
.with_log(&mut inner.undo_log)
|
||||
.into_infos_and_data()
|
||||
};
|
||||
|
||||
let lexical_region_resolutions = LexicalRegionResolutions {
|
||||
error_region: self.tcx.lifetimes.re_static,
|
||||
values: rustc_index::vec::IndexVec::from_elem_n(
|
||||
crate::infer::lexical_region_resolve::VarValue::Value(self.tcx.lifetimes.re_erased),
|
||||
var_infos.len(),
|
||||
),
|
||||
};
|
||||
|
||||
let old_value = self.lexical_region_resolutions.replace(Some(lexical_region_resolutions));
|
||||
assert!(old_value.is_none());
|
||||
}
|
||||
|
||||
/// Process the region constraints and return any any errors that
|
||||
/// result. After this, no more unification operations should be
|
||||
/// done -- or the compiler will panic -- but it is legal to use
|
||||
|
@ -1256,7 +1269,6 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
&self,
|
||||
region_context: DefId,
|
||||
outlives_env: &OutlivesEnvironment<'tcx>,
|
||||
mode: RegionckMode,
|
||||
) -> Vec<RegionResolutionError<'tcx>> {
|
||||
let (var_infos, data) = {
|
||||
let mut inner = self.inner.borrow_mut();
|
||||
|
@ -1278,7 +1290,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
&RegionRelations::new(self.tcx, region_context, outlives_env.free_region_map());
|
||||
|
||||
let (lexical_region_resolutions, errors) =
|
||||
lexical_region_resolve::resolve(region_rels, var_infos, data, mode);
|
||||
lexical_region_resolve::resolve(region_rels, var_infos, data);
|
||||
|
||||
let old_value = self.lexical_region_resolutions.replace(Some(lexical_region_resolutions));
|
||||
assert!(old_value.is_none());
|
||||
|
@ -1294,9 +1306,8 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
&self,
|
||||
region_context: DefId,
|
||||
outlives_env: &OutlivesEnvironment<'tcx>,
|
||||
mode: RegionckMode,
|
||||
) {
|
||||
let errors = self.resolve_regions(region_context, outlives_env, mode);
|
||||
let errors = self.resolve_regions(region_context, outlives_env);
|
||||
|
||||
if !self.is_tainted_by_errors() {
|
||||
// As a heuristic, just skip reporting region errors
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue