Rollup merge of #118259 - spastorino:move-eager-resolver-to-infer, r=compiler-errors
Move EagerResolution to rustc_infer::infer::resolve `EagerResolver` fits better in `rustc_infer::infer::resolver`. Started to disentagle #118118 that has a lot of unrelated things. r? `@compiler-errors` `@lcnr`
This commit is contained in:
commit
7c2244a625
@ -260,3 +260,85 @@ fn try_fold_const(&mut self, c: ty::Const<'tcx>) -> Result<ty::Const<'tcx>, Self
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// EAGER RESOLUTION
|
||||||
|
|
||||||
|
/// Resolves ty, region, and const vars to their inferred values or their root vars.
|
||||||
|
pub struct EagerResolver<'a, 'tcx> {
|
||||||
|
infcx: &'a InferCtxt<'tcx>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, 'tcx> EagerResolver<'a, 'tcx> {
|
||||||
|
pub fn new(infcx: &'a InferCtxt<'tcx>) -> Self {
|
||||||
|
EagerResolver { infcx }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for EagerResolver<'_, 'tcx> {
|
||||||
|
fn interner(&self) -> TyCtxt<'tcx> {
|
||||||
|
self.infcx.tcx
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
||||||
|
match *t.kind() {
|
||||||
|
ty::Infer(ty::TyVar(vid)) => match self.infcx.probe_ty_var(vid) {
|
||||||
|
Ok(t) => t.fold_with(self),
|
||||||
|
Err(_) => Ty::new_var(self.infcx.tcx, self.infcx.root_var(vid)),
|
||||||
|
},
|
||||||
|
ty::Infer(ty::IntVar(vid)) => self.infcx.opportunistic_resolve_int_var(vid),
|
||||||
|
ty::Infer(ty::FloatVar(vid)) => self.infcx.opportunistic_resolve_float_var(vid),
|
||||||
|
_ => {
|
||||||
|
if t.has_infer() {
|
||||||
|
t.super_fold_with(self)
|
||||||
|
} else {
|
||||||
|
t
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
|
||||||
|
match *r {
|
||||||
|
ty::ReVar(vid) => self
|
||||||
|
.infcx
|
||||||
|
.inner
|
||||||
|
.borrow_mut()
|
||||||
|
.unwrap_region_constraints()
|
||||||
|
.opportunistic_resolve_var(self.infcx.tcx, vid),
|
||||||
|
_ => r,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fold_const(&mut self, c: ty::Const<'tcx>) -> ty::Const<'tcx> {
|
||||||
|
match c.kind() {
|
||||||
|
ty::ConstKind::Infer(ty::InferConst::Var(vid)) => {
|
||||||
|
// FIXME: we need to fold the ty too, I think.
|
||||||
|
match self.infcx.probe_const_var(vid) {
|
||||||
|
Ok(c) => c.fold_with(self),
|
||||||
|
Err(_) => {
|
||||||
|
ty::Const::new_var(self.infcx.tcx, self.infcx.root_const_var(vid), c.ty())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ty::ConstKind::Infer(ty::InferConst::EffectVar(vid)) => {
|
||||||
|
debug_assert_eq!(c.ty(), self.infcx.tcx.types.bool);
|
||||||
|
match self.infcx.probe_effect_var(vid) {
|
||||||
|
Some(c) => c.as_const(self.infcx.tcx),
|
||||||
|
None => ty::Const::new_infer(
|
||||||
|
self.infcx.tcx,
|
||||||
|
ty::InferConst::EffectVar(self.infcx.root_effect_var(vid)),
|
||||||
|
self.infcx.tcx.types.bool,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
if c.has_infer() {
|
||||||
|
c.super_fold_with(self)
|
||||||
|
} else {
|
||||||
|
c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
use rustc_infer::infer::canonical::query_response::make_query_region_constraints;
|
use rustc_infer::infer::canonical::query_response::make_query_region_constraints;
|
||||||
use rustc_infer::infer::canonical::CanonicalVarValues;
|
use rustc_infer::infer::canonical::CanonicalVarValues;
|
||||||
use rustc_infer::infer::canonical::{CanonicalExt, QueryRegionConstraints};
|
use rustc_infer::infer::canonical::{CanonicalExt, QueryRegionConstraints};
|
||||||
|
use rustc_infer::infer::resolve::EagerResolver;
|
||||||
use rustc_infer::infer::{DefineOpaqueTypes, InferCtxt, InferOk};
|
use rustc_infer::infer::{DefineOpaqueTypes, InferCtxt, InferOk};
|
||||||
use rustc_middle::infer::canonical::Canonical;
|
use rustc_middle::infer::canonical::Canonical;
|
||||||
use rustc_middle::traits::query::NoSolution;
|
use rustc_middle::traits::query::NoSolution;
|
||||||
@ -25,10 +26,7 @@
|
|||||||
ExternalConstraintsData, MaybeCause, PredefinedOpaquesData, QueryInput,
|
ExternalConstraintsData, MaybeCause, PredefinedOpaquesData, QueryInput,
|
||||||
};
|
};
|
||||||
use rustc_middle::traits::ObligationCause;
|
use rustc_middle::traits::ObligationCause;
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{self, BoundVar, GenericArgKind, Ty, TyCtxt, TypeFoldable};
|
||||||
self, BoundVar, GenericArgKind, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperFoldable,
|
|
||||||
TypeVisitableExt,
|
|
||||||
};
|
|
||||||
use rustc_span::DUMMY_SP;
|
use rustc_span::DUMMY_SP;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
@ -58,7 +56,7 @@ pub(super) fn canonicalize_goal<T: TypeFoldable<TyCtxt<'tcx>>>(
|
|||||||
) -> (Vec<ty::GenericArg<'tcx>>, CanonicalInput<'tcx, T>) {
|
) -> (Vec<ty::GenericArg<'tcx>>, CanonicalInput<'tcx, T>) {
|
||||||
let opaque_types = self.infcx.clone_opaque_types_for_query_response();
|
let opaque_types = self.infcx.clone_opaque_types_for_query_response();
|
||||||
let (goal, opaque_types) =
|
let (goal, opaque_types) =
|
||||||
(goal, opaque_types).fold_with(&mut EagerResolver { infcx: self.infcx });
|
(goal, opaque_types).fold_with(&mut EagerResolver::new(self.infcx));
|
||||||
|
|
||||||
let mut orig_values = Default::default();
|
let mut orig_values = Default::default();
|
||||||
let canonical_goal = Canonicalizer::canonicalize(
|
let canonical_goal = Canonicalizer::canonicalize(
|
||||||
@ -115,7 +113,7 @@ pub(in crate::solve) fn evaluate_added_goals_and_make_canonical_response(
|
|||||||
let external_constraints = self.compute_external_query_constraints()?;
|
let external_constraints = self.compute_external_query_constraints()?;
|
||||||
|
|
||||||
let (var_values, mut external_constraints) =
|
let (var_values, mut external_constraints) =
|
||||||
(var_values, external_constraints).fold_with(&mut EagerResolver { infcx: self.infcx });
|
(var_values, external_constraints).fold_with(&mut EagerResolver::new(self.infcx));
|
||||||
// Remove any trivial region constraints once we've resolved regions
|
// Remove any trivial region constraints once we've resolved regions
|
||||||
external_constraints
|
external_constraints
|
||||||
.region_constraints
|
.region_constraints
|
||||||
@ -364,86 +362,13 @@ fn register_opaque_types(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Resolves ty, region, and const vars to their inferred values or their root vars.
|
|
||||||
struct EagerResolver<'a, 'tcx> {
|
|
||||||
infcx: &'a InferCtxt<'tcx>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> TypeFolder<TyCtxt<'tcx>> for EagerResolver<'_, 'tcx> {
|
|
||||||
fn interner(&self) -> TyCtxt<'tcx> {
|
|
||||||
self.infcx.tcx
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> {
|
|
||||||
match *t.kind() {
|
|
||||||
ty::Infer(ty::TyVar(vid)) => match self.infcx.probe_ty_var(vid) {
|
|
||||||
Ok(t) => t.fold_with(self),
|
|
||||||
Err(_) => Ty::new_var(self.infcx.tcx, self.infcx.root_var(vid)),
|
|
||||||
},
|
|
||||||
ty::Infer(ty::IntVar(vid)) => self.infcx.opportunistic_resolve_int_var(vid),
|
|
||||||
ty::Infer(ty::FloatVar(vid)) => self.infcx.opportunistic_resolve_float_var(vid),
|
|
||||||
_ => {
|
|
||||||
if t.has_infer() {
|
|
||||||
t.super_fold_with(self)
|
|
||||||
} else {
|
|
||||||
t
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
|
|
||||||
match *r {
|
|
||||||
ty::ReVar(vid) => self
|
|
||||||
.infcx
|
|
||||||
.inner
|
|
||||||
.borrow_mut()
|
|
||||||
.unwrap_region_constraints()
|
|
||||||
.opportunistic_resolve_var(self.infcx.tcx, vid),
|
|
||||||
_ => r,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fold_const(&mut self, c: ty::Const<'tcx>) -> ty::Const<'tcx> {
|
|
||||||
match c.kind() {
|
|
||||||
ty::ConstKind::Infer(ty::InferConst::Var(vid)) => {
|
|
||||||
// FIXME: we need to fold the ty too, I think.
|
|
||||||
match self.infcx.probe_const_var(vid) {
|
|
||||||
Ok(c) => c.fold_with(self),
|
|
||||||
Err(_) => {
|
|
||||||
ty::Const::new_var(self.infcx.tcx, self.infcx.root_const_var(vid), c.ty())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ty::ConstKind::Infer(ty::InferConst::EffectVar(vid)) => {
|
|
||||||
debug_assert_eq!(c.ty(), self.infcx.tcx.types.bool);
|
|
||||||
match self.infcx.probe_effect_var(vid) {
|
|
||||||
Some(c) => c.as_const(self.infcx.tcx),
|
|
||||||
None => ty::Const::new_infer(
|
|
||||||
self.infcx.tcx,
|
|
||||||
ty::InferConst::EffectVar(self.infcx.root_effect_var(vid)),
|
|
||||||
self.infcx.tcx.types.bool,
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
if c.has_infer() {
|
|
||||||
c.super_fold_with(self)
|
|
||||||
} else {
|
|
||||||
c
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> inspect::ProofTreeBuilder<'tcx> {
|
impl<'tcx> inspect::ProofTreeBuilder<'tcx> {
|
||||||
pub fn make_canonical_state<T: TypeFoldable<TyCtxt<'tcx>>>(
|
pub fn make_canonical_state<T: TypeFoldable<TyCtxt<'tcx>>>(
|
||||||
ecx: &EvalCtxt<'_, 'tcx>,
|
ecx: &EvalCtxt<'_, 'tcx>,
|
||||||
data: T,
|
data: T,
|
||||||
) -> inspect::CanonicalState<'tcx, T> {
|
) -> inspect::CanonicalState<'tcx, T> {
|
||||||
let state = inspect::State { var_values: ecx.var_values, data };
|
let state = inspect::State { var_values: ecx.var_values, data };
|
||||||
let state = state.fold_with(&mut EagerResolver { infcx: ecx.infcx });
|
let state = state.fold_with(&mut EagerResolver::new(ecx.infcx));
|
||||||
Canonicalizer::canonicalize(
|
Canonicalizer::canonicalize(
|
||||||
ecx.infcx,
|
ecx.infcx,
|
||||||
CanonicalizeMode::Response { max_input_universe: ecx.max_input_universe },
|
CanonicalizeMode::Response { max_input_universe: ecx.max_input_universe },
|
||||||
|
Loading…
Reference in New Issue
Block a user