Remove SelectionContext::infcx() in favor of field access
This commit is contained in:
parent
8681d4cffc
commit
6436c348db
8 changed files with 75 additions and 92 deletions
|
@ -194,7 +194,7 @@ pub(super) fn poly_project_and_unify_type<'cx, 'tcx>(
|
|||
selcx: &mut SelectionContext<'cx, 'tcx>,
|
||||
obligation: &PolyProjectionObligation<'tcx>,
|
||||
) -> ProjectAndUnifyResult<'tcx> {
|
||||
let infcx = selcx.infcx();
|
||||
let infcx = selcx.infcx;
|
||||
let r = infcx.commit_if_ok(|_snapshot| {
|
||||
let old_universe = infcx.universe();
|
||||
let placeholder_predicate =
|
||||
|
@ -250,7 +250,7 @@ fn project_and_unify_type<'cx, 'tcx>(
|
|||
) -> ProjectAndUnifyResult<'tcx> {
|
||||
let mut obligations = vec![];
|
||||
|
||||
let infcx = selcx.infcx();
|
||||
let infcx = selcx.infcx;
|
||||
let normalized = match opt_normalize_projection_type(
|
||||
selcx,
|
||||
obligation.param_env,
|
||||
|
@ -269,7 +269,7 @@ fn project_and_unify_type<'cx, 'tcx>(
|
|||
// This allows users to omit re-mentioning all bounds on an associated type and just use an
|
||||
// `impl Trait` for the assoc type to add more bounds.
|
||||
let InferOk { value: actual, obligations: new } =
|
||||
selcx.infcx().replace_opaque_types_with_inference_vars(
|
||||
selcx.infcx.replace_opaque_types_with_inference_vars(
|
||||
actual,
|
||||
obligation.cause.body_id,
|
||||
obligation.cause.span,
|
||||
|
@ -445,7 +445,7 @@ impl<'a, 'b, 'tcx> AssocTypeNormalizer<'a, 'b, 'tcx> {
|
|||
}
|
||||
|
||||
fn fold<T: TypeFoldable<'tcx>>(&mut self, value: T) -> T {
|
||||
let value = self.selcx.infcx().resolve_vars_if_possible(value);
|
||||
let value = self.selcx.infcx.resolve_vars_if_possible(value);
|
||||
debug!(?value);
|
||||
|
||||
assert!(
|
||||
|
@ -524,7 +524,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> {
|
|||
self.param_env,
|
||||
ty,
|
||||
);
|
||||
self.selcx.infcx().err_ctxt().report_overflow_error(&obligation, true);
|
||||
self.selcx.infcx.err_ctxt().report_overflow_error(&obligation, true);
|
||||
}
|
||||
|
||||
let substs = substs.fold_with(self);
|
||||
|
@ -590,7 +590,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> {
|
|||
// want to figure out how to register obligations with escaping vars
|
||||
// or handle this some other way.
|
||||
|
||||
let infcx = self.selcx.infcx();
|
||||
let infcx = self.selcx.infcx;
|
||||
let (data, mapped_regions, mapped_types, mapped_consts) =
|
||||
BoundVarReplacer::replace_bound_vars(infcx, &mut self.universes, data);
|
||||
let data = data.fold_with(self);
|
||||
|
@ -640,7 +640,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> {
|
|||
let constant = constant.super_fold_with(self);
|
||||
debug!(?constant, ?self.param_env);
|
||||
with_replaced_escaping_bound_vars(
|
||||
self.selcx.infcx(),
|
||||
self.selcx.infcx,
|
||||
&mut self.universes,
|
||||
constant,
|
||||
|constant| constant.eval(tcx, self.param_env),
|
||||
|
@ -992,10 +992,7 @@ pub fn normalize_projection_type<'a, 'b, 'tcx>(
|
|||
// and a deferred predicate to resolve this when more type
|
||||
// information is available.
|
||||
|
||||
selcx
|
||||
.infcx()
|
||||
.infer_projection(param_env, projection_ty, cause, depth + 1, obligations)
|
||||
.into()
|
||||
selcx.infcx.infer_projection(param_env, projection_ty, cause, depth + 1, obligations).into()
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1018,7 +1015,7 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>(
|
|||
depth: usize,
|
||||
obligations: &mut Vec<PredicateObligation<'tcx>>,
|
||||
) -> Result<Option<Term<'tcx>>, InProgress> {
|
||||
let infcx = selcx.infcx();
|
||||
let infcx = selcx.infcx;
|
||||
// Don't use the projection cache in intercrate mode -
|
||||
// the `infcx` may be re-used between intercrate in non-intercrate
|
||||
// mode, which could lead to using incorrect cache results.
|
||||
|
@ -1110,7 +1107,7 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>(
|
|||
// an impl, where-clause etc) and hence we must
|
||||
// re-normalize it
|
||||
|
||||
let projected_term = selcx.infcx().resolve_vars_if_possible(projected_term);
|
||||
let projected_term = selcx.infcx.resolve_vars_if_possible(projected_term);
|
||||
|
||||
let mut result = if projected_term.has_projections() {
|
||||
let mut normalizer = AssocTypeNormalizer::new(
|
||||
|
@ -1206,9 +1203,9 @@ fn normalize_to_error<'a, 'tcx>(
|
|||
param_env,
|
||||
predicate: trait_ref.without_const().to_predicate(selcx.tcx()),
|
||||
};
|
||||
let tcx = selcx.infcx().tcx;
|
||||
let tcx = selcx.infcx.tcx;
|
||||
let def_id = projection_ty.item_def_id;
|
||||
let new_value = selcx.infcx().next_ty_var(TypeVariableOrigin {
|
||||
let new_value = selcx.infcx.next_ty_var(TypeVariableOrigin {
|
||||
kind: TypeVariableOriginKind::NormalizeProjectionType,
|
||||
span: tcx.def_span(def_id),
|
||||
});
|
||||
|
@ -1330,7 +1327,7 @@ fn assemble_candidate_for_impl_trait_in_trait<'cx, 'tcx>(
|
|||
let trait_predicate =
|
||||
ty::Binder::dummy(ty::TraitRef { def_id: trait_def_id, substs: trait_substs });
|
||||
|
||||
let _ = selcx.infcx().commit_if_ok(|_| {
|
||||
let _ = selcx.infcx.commit_if_ok(|_| {
|
||||
match selcx.select(&obligation.with(tcx, trait_predicate)) {
|
||||
Ok(Some(super::ImplSource::UserDefined(data))) => {
|
||||
candidate_set.push_candidate(ProjectionCandidate::ImplTraitInTrait(
|
||||
|
@ -1435,7 +1432,7 @@ fn assemble_candidates_from_object_ty<'cx, 'tcx>(
|
|||
let tcx = selcx.tcx();
|
||||
|
||||
let self_ty = obligation.predicate.self_ty();
|
||||
let object_ty = selcx.infcx().shallow_resolve(self_ty);
|
||||
let object_ty = selcx.infcx.shallow_resolve(self_ty);
|
||||
let data = match object_ty.kind() {
|
||||
ty::Dynamic(data, ..) => data,
|
||||
ty::Infer(ty::TyVar(_)) => {
|
||||
|
@ -1473,7 +1470,7 @@ fn assemble_candidates_from_predicates<'cx, 'tcx>(
|
|||
env_predicates: impl Iterator<Item = ty::Predicate<'tcx>>,
|
||||
potentially_unnormalized_candidates: bool,
|
||||
) {
|
||||
let infcx = selcx.infcx();
|
||||
let infcx = selcx.infcx;
|
||||
for predicate in env_predicates {
|
||||
let bound_predicate = predicate.kind();
|
||||
if let ty::PredicateKind::Clause(ty::Clause::Projection(data)) =
|
||||
|
@ -1529,7 +1526,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||
// start out by selecting the predicate `T as TraitRef<...>`:
|
||||
let poly_trait_ref = ty::Binder::dummy(obligation.predicate.trait_ref(selcx.tcx()));
|
||||
let trait_obligation = obligation.with(selcx.tcx(), poly_trait_ref);
|
||||
let _ = selcx.infcx().commit_if_ok(|_| {
|
||||
let _ = selcx.infcx.commit_if_ok(|_| {
|
||||
let impl_source = match selcx.select(&trait_obligation) {
|
||||
Ok(Some(impl_source)) => impl_source,
|
||||
Ok(None) => {
|
||||
|
@ -1587,7 +1584,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||
if obligation.param_env.reveal() == Reveal::All {
|
||||
// NOTE(eddyb) inference variables can resolve to parameters, so
|
||||
// assume `poly_trait_ref` isn't monomorphic, if it contains any.
|
||||
let poly_trait_ref = selcx.infcx().resolve_vars_if_possible(poly_trait_ref);
|
||||
let poly_trait_ref = selcx.infcx.resolve_vars_if_possible(poly_trait_ref);
|
||||
!poly_trait_ref.still_further_specializable()
|
||||
} else {
|
||||
debug!(
|
||||
|
@ -1603,7 +1600,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||
// While a builtin impl may be known to exist, the associated type may not yet
|
||||
// be known. Any type with multiple potential associated types is therefore
|
||||
// not eligible.
|
||||
let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());
|
||||
let self_ty = selcx.infcx.shallow_resolve(obligation.predicate.self_ty());
|
||||
|
||||
let lang_items = selcx.tcx().lang_items();
|
||||
if lang_items.discriminant_kind_trait() == Some(poly_trait_ref.def_id()) {
|
||||
|
@ -1690,7 +1687,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
|
|||
// type parameters, opaques, and unnormalized projections have pointer
|
||||
// metadata if they're known (e.g. by the param_env) to be sized
|
||||
ty::Param(_) | ty::Projection(..) | ty::Opaque(..)
|
||||
if selcx.infcx().predicate_must_hold_modulo_regions(
|
||||
if selcx.infcx.predicate_must_hold_modulo_regions(
|
||||
&obligation.with(
|
||||
selcx.tcx(),
|
||||
ty::Binder::dummy(
|
||||
|
@ -1818,8 +1815,7 @@ fn confirm_candidate<'cx, 'tcx>(
|
|||
// when possible for this to work. See `auto-trait-projection-recursion.rs`
|
||||
// for a case where this matters.
|
||||
if progress.term.has_infer_regions() {
|
||||
progress.term =
|
||||
progress.term.fold_with(&mut OpportunisticRegionResolver::new(selcx.infcx()));
|
||||
progress.term = progress.term.fold_with(&mut OpportunisticRegionResolver::new(selcx.infcx));
|
||||
}
|
||||
progress
|
||||
}
|
||||
|
@ -2000,7 +1996,7 @@ fn confirm_fn_pointer_candidate<'cx, 'tcx>(
|
|||
obligation: &ProjectionTyObligation<'tcx>,
|
||||
fn_pointer_impl_source: ImplSourceFnPointerData<'tcx, PredicateObligation<'tcx>>,
|
||||
) -> Progress<'tcx> {
|
||||
let fn_type = selcx.infcx().shallow_resolve(fn_pointer_impl_source.fn_ty);
|
||||
let fn_type = selcx.infcx.shallow_resolve(fn_pointer_impl_source.fn_ty);
|
||||
let sig = fn_type.fn_sig(selcx.tcx());
|
||||
let Normalized { value: sig, obligations } = normalize_with_depth(
|
||||
selcx,
|
||||
|
@ -2073,7 +2069,7 @@ fn confirm_param_env_candidate<'cx, 'tcx>(
|
|||
poly_cache_entry: ty::PolyProjectionPredicate<'tcx>,
|
||||
potentially_unnormalized_candidate: bool,
|
||||
) -> Progress<'tcx> {
|
||||
let infcx = selcx.infcx();
|
||||
let infcx = selcx.infcx;
|
||||
let cause = &obligation.cause;
|
||||
let param_env = obligation.param_env;
|
||||
|
||||
|
@ -2168,7 +2164,7 @@ fn confirm_impl_candidate<'cx, 'tcx>(
|
|||
// * `substs` ends up as `[u32, S]`
|
||||
let substs = obligation.predicate.substs.rebase_onto(tcx, trait_def_id, substs);
|
||||
let substs =
|
||||
translate_substs(selcx.infcx(), param_env, impl_def_id, substs, assoc_ty.defining_node);
|
||||
translate_substs(selcx.infcx, param_env, impl_def_id, substs, assoc_ty.defining_node);
|
||||
let ty = tcx.bound_type_of(assoc_ty.item.def_id);
|
||||
let is_const = matches!(tcx.def_kind(assoc_ty.item.def_id), DefKind::AssocConst);
|
||||
let term: ty::EarlyBinder<ty::Term<'tcx>> = if is_const {
|
||||
|
@ -2264,7 +2260,7 @@ fn confirm_impl_trait_in_trait_candidate<'tcx>(
|
|||
let impl_fn_substs =
|
||||
obligation.predicate.substs.rebase_onto(tcx, tcx.parent(trait_fn_def_id), data.substs);
|
||||
let impl_fn_substs = translate_substs(
|
||||
selcx.infcx(),
|
||||
selcx.infcx,
|
||||
obligation.param_env,
|
||||
data.impl_def_id,
|
||||
impl_fn_substs,
|
||||
|
@ -2424,7 +2420,7 @@ impl<'cx, 'tcx> ProjectionCacheKeyExt<'cx, 'tcx> for ProjectionCacheKey<'tcx> {
|
|||
selcx: &mut SelectionContext<'cx, 'tcx>,
|
||||
predicate: ty::PolyProjectionPredicate<'tcx>,
|
||||
) -> Option<Self> {
|
||||
let infcx = selcx.infcx();
|
||||
let infcx = selcx.infcx;
|
||||
// We don't do cross-snapshot caching of obligations with escaping regions,
|
||||
// so there's no cache key to use
|
||||
predicate.no_bound_vars().map(|predicate| {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue