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
|
@ -599,17 +599,17 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
computed_preds: &mut FxIndexSet<ty::Predicate<'tcx>>,
|
||||
fresh_preds: &mut FxHashSet<ty::Predicate<'tcx>>,
|
||||
predicates: &mut VecDeque<ty::PolyTraitPredicate<'tcx>>,
|
||||
select: &mut SelectionContext<'_, 'tcx>,
|
||||
selcx: &mut SelectionContext<'_, 'tcx>,
|
||||
only_projections: bool,
|
||||
) -> bool {
|
||||
let dummy_cause = ObligationCause::dummy();
|
||||
|
||||
for obligation in nested {
|
||||
let is_new_pred =
|
||||
fresh_preds.insert(self.clean_pred(select.infcx(), obligation.predicate));
|
||||
fresh_preds.insert(self.clean_pred(selcx.infcx, obligation.predicate));
|
||||
|
||||
// Resolve any inference variables that we can, to help selection succeed
|
||||
let predicate = select.infcx().resolve_vars_if_possible(obligation.predicate);
|
||||
let predicate = selcx.infcx.resolve_vars_if_possible(obligation.predicate);
|
||||
|
||||
// We only add a predicate as a user-displayable bound if
|
||||
// it involves a generic parameter, and doesn't contain
|
||||
|
@ -717,10 +717,8 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
// and turn them into an explicit negative impl for our type.
|
||||
debug!("Projecting and unifying projection predicate {:?}", predicate);
|
||||
|
||||
match project::poly_project_and_unify_type(
|
||||
select,
|
||||
&obligation.with(self.tcx, p),
|
||||
) {
|
||||
match project::poly_project_and_unify_type(selcx, &obligation.with(self.tcx, p))
|
||||
{
|
||||
ProjectAndUnifyResult::MismatchedProjectionTypes(e) => {
|
||||
debug!(
|
||||
"evaluate_nested_obligations: Unable to unify predicate \
|
||||
|
@ -745,7 +743,7 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
computed_preds,
|
||||
fresh_preds,
|
||||
predicates,
|
||||
select,
|
||||
selcx,
|
||||
only_projections,
|
||||
) {
|
||||
return false;
|
||||
|
@ -768,7 +766,7 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
}
|
||||
ty::PredicateKind::Clause(ty::Clause::RegionOutlives(binder)) => {
|
||||
let binder = bound_predicate.rebind(binder);
|
||||
select.infcx().region_outlives_predicate(&dummy_cause, binder)
|
||||
selcx.infcx.region_outlives_predicate(&dummy_cause, binder)
|
||||
}
|
||||
ty::PredicateKind::Clause(ty::Clause::TypeOutlives(binder)) => {
|
||||
let binder = bound_predicate.rebind(binder);
|
||||
|
@ -777,14 +775,14 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
binder.map_bound_ref(|pred| pred.0).no_bound_vars(),
|
||||
) {
|
||||
(None, Some(t_a)) => {
|
||||
select.infcx().register_region_obligation_with_cause(
|
||||
selcx.infcx.register_region_obligation_with_cause(
|
||||
t_a,
|
||||
select.infcx().tcx.lifetimes.re_static,
|
||||
selcx.infcx.tcx.lifetimes.re_static,
|
||||
&dummy_cause,
|
||||
);
|
||||
}
|
||||
(Some(ty::OutlivesPredicate(t_a, r_b)), _) => {
|
||||
select.infcx().register_region_obligation_with_cause(
|
||||
selcx.infcx.register_region_obligation_with_cause(
|
||||
t_a,
|
||||
r_b,
|
||||
&dummy_cause,
|
||||
|
@ -796,13 +794,13 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
ty::PredicateKind::ConstEquate(c1, c2) => {
|
||||
let evaluate = |c: ty::Const<'tcx>| {
|
||||
if let ty::ConstKind::Unevaluated(unevaluated) = c.kind() {
|
||||
match select.infcx().const_eval_resolve(
|
||||
match selcx.infcx.const_eval_resolve(
|
||||
obligation.param_env,
|
||||
unevaluated,
|
||||
Some(obligation.cause.span),
|
||||
) {
|
||||
Ok(Some(valtree)) => {
|
||||
Ok(ty::Const::from_value(select.tcx(), valtree, c.ty()))
|
||||
Ok(ty::Const::from_value(selcx.tcx(), valtree, c.ty()))
|
||||
}
|
||||
Ok(None) => {
|
||||
let tcx = self.tcx;
|
||||
|
@ -823,10 +821,7 @@ impl<'tcx> AutoTraitFinder<'tcx> {
|
|||
|
||||
match (evaluate(c1), evaluate(c2)) {
|
||||
(Ok(c1), Ok(c2)) => {
|
||||
match select
|
||||
.infcx()
|
||||
.at(&obligation.cause, obligation.param_env)
|
||||
.eq(c1, c2)
|
||||
match selcx.infcx.at(&obligation.cause, obligation.param_env).eq(c1, c2)
|
||||
{
|
||||
Ok(_) => (),
|
||||
Err(_) => return false,
|
||||
|
|
|
@ -119,7 +119,7 @@ fn with_fresh_ty_vars<'cx, 'tcx>(
|
|||
impl_def_id: DefId,
|
||||
) -> ty::ImplHeader<'tcx> {
|
||||
let tcx = selcx.tcx();
|
||||
let impl_substs = selcx.infcx().fresh_substs_for_item(DUMMY_SP, impl_def_id);
|
||||
let impl_substs = selcx.infcx.fresh_substs_for_item(DUMMY_SP, impl_def_id);
|
||||
|
||||
let header = ty::ImplHeader {
|
||||
impl_def_id,
|
||||
|
@ -149,7 +149,7 @@ fn overlap<'cx, 'tcx>(
|
|||
impl1_def_id, impl2_def_id, overlap_mode
|
||||
);
|
||||
|
||||
selcx.infcx().probe_maybe_skip_leak_check(skip_leak_check.is_yes(), |snapshot| {
|
||||
selcx.infcx.probe_maybe_skip_leak_check(skip_leak_check.is_yes(), |snapshot| {
|
||||
overlap_within_probe(selcx, impl1_def_id, impl2_def_id, overlap_mode, snapshot)
|
||||
})
|
||||
}
|
||||
|
@ -161,7 +161,7 @@ fn overlap_within_probe<'cx, 'tcx>(
|
|||
overlap_mode: OverlapMode,
|
||||
snapshot: &CombinedSnapshot<'tcx>,
|
||||
) -> Option<OverlapResult<'tcx>> {
|
||||
let infcx = selcx.infcx();
|
||||
let infcx = selcx.infcx;
|
||||
|
||||
if overlap_mode.use_negative_impl() {
|
||||
if negative_impl(infcx.tcx, impl1_def_id, impl2_def_id)
|
||||
|
@ -200,9 +200,9 @@ fn overlap_within_probe<'cx, 'tcx>(
|
|||
debug!("overlap: intercrate_ambiguity_causes={:#?}", intercrate_ambiguity_causes);
|
||||
|
||||
let involves_placeholder =
|
||||
matches!(selcx.infcx().region_constraints_added_in_snapshot(snapshot), Some(true));
|
||||
matches!(selcx.infcx.region_constraints_added_in_snapshot(snapshot), Some(true));
|
||||
|
||||
let impl_header = selcx.infcx().resolve_vars_if_possible(impl1_header);
|
||||
let impl_header = selcx.infcx.resolve_vars_if_possible(impl1_header);
|
||||
Some(OverlapResult { impl_header, intercrate_ambiguity_causes, involves_placeholder })
|
||||
}
|
||||
|
||||
|
@ -214,7 +214,7 @@ fn equate_impl_headers<'cx, 'tcx>(
|
|||
// Do `a` and `b` unify? If not, no overlap.
|
||||
debug!("equate_impl_headers(impl1_header={:?}, impl2_header={:?}", impl1_header, impl2_header);
|
||||
selcx
|
||||
.infcx()
|
||||
.infcx
|
||||
.at(&ObligationCause::dummy(), ty::ParamEnv::empty())
|
||||
.eq_impl_headers(impl1_header, impl2_header)
|
||||
.map(|infer_ok| infer_ok.obligations)
|
||||
|
@ -255,7 +255,7 @@ fn implicit_negative<'cx, 'tcx>(
|
|||
"implicit_negative(impl1_header={:?}, impl2_header={:?}, obligations={:?})",
|
||||
impl1_header, impl2_header, obligations
|
||||
);
|
||||
let infcx = selcx.infcx();
|
||||
let infcx = selcx.infcx;
|
||||
let opt_failing_obligation = impl1_header
|
||||
.predicates
|
||||
.iter()
|
||||
|
|
|
@ -199,7 +199,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
// code is so hot. 1 and 0 dominate; 2+ is fairly rare.
|
||||
1 => {
|
||||
let infer_var = pending_obligation.stalled_on[0];
|
||||
self.selcx.infcx().ty_or_const_infer_var_changed(infer_var)
|
||||
self.selcx.infcx.ty_or_const_infer_var_changed(infer_var)
|
||||
}
|
||||
0 => {
|
||||
// In this case we haven't changed, but wish to make a change.
|
||||
|
@ -210,7 +210,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
// form was a perf win. See #64545 for details.
|
||||
(|| {
|
||||
for &infer_var in &pending_obligation.stalled_on {
|
||||
if self.selcx.infcx().ty_or_const_infer_var_changed(infer_var) {
|
||||
if self.selcx.infcx.ty_or_const_infer_var_changed(infer_var) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -240,13 +240,12 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
debug!(?obligation, "pre-resolve");
|
||||
|
||||
if obligation.predicate.has_non_region_infer() {
|
||||
obligation.predicate =
|
||||
self.selcx.infcx().resolve_vars_if_possible(obligation.predicate);
|
||||
obligation.predicate = self.selcx.infcx.resolve_vars_if_possible(obligation.predicate);
|
||||
}
|
||||
|
||||
let obligation = &pending_obligation.obligation;
|
||||
|
||||
let infcx = self.selcx.infcx();
|
||||
let infcx = self.selcx.infcx;
|
||||
|
||||
if obligation.predicate.has_projections() {
|
||||
let mut obligations = Vec::new();
|
||||
|
@ -353,7 +352,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
}
|
||||
|
||||
ty::PredicateKind::ClosureKind(_, closure_substs, kind) => {
|
||||
match self.selcx.infcx().closure_kind(closure_substs) {
|
||||
match self.selcx.infcx.closure_kind(closure_substs) {
|
||||
Some(closure_kind) => {
|
||||
if closure_kind.extends(kind) {
|
||||
ProcessResult::Changed(vec![])
|
||||
|
@ -367,7 +366,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
|
||||
ty::PredicateKind::WellFormed(arg) => {
|
||||
match wf::obligations(
|
||||
self.selcx.infcx(),
|
||||
self.selcx.infcx,
|
||||
obligation.param_env,
|
||||
obligation.cause.body_id,
|
||||
obligation.recursion_depth + 1,
|
||||
|
@ -384,7 +383,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
}
|
||||
|
||||
ty::PredicateKind::Subtype(subtype) => {
|
||||
match self.selcx.infcx().subtype_predicate(
|
||||
match self.selcx.infcx.subtype_predicate(
|
||||
&obligation.cause,
|
||||
obligation.param_env,
|
||||
Binder::dummy(subtype),
|
||||
|
@ -408,7 +407,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
}
|
||||
|
||||
ty::PredicateKind::Coerce(coerce) => {
|
||||
match self.selcx.infcx().coerce_predicate(
|
||||
match self.selcx.infcx.coerce_predicate(
|
||||
&obligation.cause,
|
||||
obligation.param_env,
|
||||
Binder::dummy(coerce),
|
||||
|
@ -432,7 +431,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
|
||||
ty::PredicateKind::ConstEvaluatable(uv) => {
|
||||
match const_evaluatable::is_const_evaluatable(
|
||||
self.selcx.infcx(),
|
||||
self.selcx.infcx,
|
||||
uv,
|
||||
obligation.param_env,
|
||||
obligation.cause.span,
|
||||
|
@ -476,7 +475,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
|
||||
let mut evaluate = |c: Const<'tcx>| {
|
||||
if let ty::ConstKind::Unevaluated(unevaluated) = c.kind() {
|
||||
match self.selcx.infcx().try_const_eval_resolve(
|
||||
match self.selcx.infcx.try_const_eval_resolve(
|
||||
obligation.param_env,
|
||||
unevaluated,
|
||||
c.ty(),
|
||||
|
@ -504,7 +503,7 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||
(Ok(c1), Ok(c2)) => {
|
||||
match self
|
||||
.selcx
|
||||
.infcx()
|
||||
.infcx
|
||||
.at(&obligation.cause, obligation.param_env)
|
||||
.eq(c1, c2)
|
||||
{
|
||||
|
@ -572,7 +571,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
|
|||
trait_obligation: TraitObligation<'tcx>,
|
||||
stalled_on: &mut Vec<TyOrConstInferVar<'tcx>>,
|
||||
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
|
||||
let infcx = self.selcx.infcx();
|
||||
let infcx = self.selcx.infcx;
|
||||
if obligation.predicate.is_global() {
|
||||
// no type variables present, can use evaluation for better caching.
|
||||
// FIXME: consider caching errors too.
|
||||
|
@ -630,7 +629,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
|
|||
if obligation.predicate.is_global() {
|
||||
// no type variables present, can use evaluation for better caching.
|
||||
// FIXME: consider caching errors too.
|
||||
if self.selcx.infcx().predicate_must_hold_considering_regions(obligation) {
|
||||
if self.selcx.infcx.predicate_must_hold_considering_regions(obligation) {
|
||||
if let Some(key) = ProjectionCacheKey::from_poly_projection_predicate(
|
||||
&mut self.selcx,
|
||||
project_obligation.predicate,
|
||||
|
@ -639,7 +638,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
|
|||
// evaluated all sub-obligations. We can therefore mark the 'root'
|
||||
// obligation as complete, and skip evaluating sub-obligations.
|
||||
self.selcx
|
||||
.infcx()
|
||||
.infcx
|
||||
.inner
|
||||
.borrow_mut()
|
||||
.projection_cache()
|
||||
|
@ -678,7 +677,7 @@ fn substs_infer_vars<'a, 'tcx>(
|
|||
substs: ty::Binder<'tcx, SubstsRef<'tcx>>,
|
||||
) -> impl Iterator<Item = TyOrConstInferVar<'tcx>> {
|
||||
selcx
|
||||
.infcx()
|
||||
.infcx
|
||||
.resolve_vars_if_possible(substs)
|
||||
.skip_binder() // ok because this check doesn't care about regions
|
||||
.iter()
|
||||
|
|
|
@ -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| {
|
||||
|
|
|
@ -238,7 +238,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
param_env: obligation.param_env,
|
||||
cause: obligation.cause.clone(),
|
||||
recursion_depth: obligation.recursion_depth,
|
||||
predicate: self.infcx().resolve_vars_if_possible(obligation.predicate),
|
||||
predicate: self.infcx.resolve_vars_if_possible(obligation.predicate),
|
||||
};
|
||||
|
||||
if obligation.predicate.skip_binder().self_ty().is_ty_var() {
|
||||
|
@ -689,9 +689,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
|
||||
debug!(?poly_trait_ref, "assemble_candidates_from_object_ty");
|
||||
|
||||
let poly_trait_predicate = self.infcx().resolve_vars_if_possible(obligation.predicate);
|
||||
let poly_trait_predicate = self.infcx.resolve_vars_if_possible(obligation.predicate);
|
||||
let placeholder_trait_predicate =
|
||||
self.infcx().replace_bound_vars_with_placeholders(poly_trait_predicate);
|
||||
self.infcx.replace_bound_vars_with_placeholders(poly_trait_predicate);
|
||||
|
||||
// Count only those upcast versions that match the trait-ref
|
||||
// we are looking for. Specifically, do not only check for the
|
||||
|
@ -940,7 +940,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
return;
|
||||
}
|
||||
|
||||
let self_ty = self.infcx().shallow_resolve(obligation.self_ty());
|
||||
let self_ty = self.infcx.shallow_resolve(obligation.self_ty());
|
||||
match self_ty.skip_binder().kind() {
|
||||
ty::Opaque(..)
|
||||
| ty::Dynamic(..)
|
||||
|
@ -1007,7 +1007,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
obligation: &TraitObligation<'tcx>,
|
||||
candidates: &mut SelectionCandidateSet<'tcx>,
|
||||
) {
|
||||
let self_ty = self.infcx().shallow_resolve(obligation.self_ty().skip_binder());
|
||||
let self_ty = self.infcx.shallow_resolve(obligation.self_ty().skip_binder());
|
||||
match self_ty.kind() {
|
||||
ty::Tuple(_) => {
|
||||
candidates.vec.push(BuiltinCandidate { has_nested: false });
|
||||
|
|
|
@ -147,7 +147,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
|
||||
let trait_predicate = self.infcx.shallow_resolve(obligation.predicate);
|
||||
let placeholder_trait_predicate =
|
||||
self.infcx().replace_bound_vars_with_placeholders(trait_predicate).trait_ref;
|
||||
self.infcx.replace_bound_vars_with_placeholders(trait_predicate).trait_ref;
|
||||
let placeholder_self_ty = placeholder_trait_predicate.self_ty();
|
||||
let placeholder_trait_predicate = ty::Binder::dummy(placeholder_trait_predicate);
|
||||
let (def_id, substs) = match *placeholder_self_ty.kind() {
|
||||
|
@ -639,7 +639,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
debug!(?obligation, "confirm_trait_alias_candidate");
|
||||
|
||||
let alias_def_id = obligation.predicate.def_id();
|
||||
let predicate = self.infcx().replace_bound_vars_with_placeholders(obligation.predicate);
|
||||
let predicate = self.infcx.replace_bound_vars_with_placeholders(obligation.predicate);
|
||||
let trait_ref = predicate.trait_ref;
|
||||
let trait_def_id = trait_ref.def_id;
|
||||
let substs = trait_ref.substs;
|
||||
|
|
|
@ -101,7 +101,7 @@ impl IntercrateAmbiguityCause {
|
|||
}
|
||||
|
||||
pub struct SelectionContext<'cx, 'tcx> {
|
||||
infcx: &'cx InferCtxt<'tcx>,
|
||||
pub infcx: &'cx InferCtxt<'tcx>,
|
||||
|
||||
/// Freshener used specifically for entries on the obligation
|
||||
/// stack. This ensures that all entries on the stack at one time
|
||||
|
@ -237,10 +237,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
self.intercrate_ambiguity_causes.take().unwrap_or_default()
|
||||
}
|
||||
|
||||
pub fn infcx(&self) -> &'cx InferCtxt<'tcx> {
|
||||
self.infcx
|
||||
}
|
||||
|
||||
pub fn tcx(&self) -> TyCtxt<'tcx> {
|
||||
self.infcx.tcx
|
||||
}
|
||||
|
@ -693,10 +689,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
|
||||
match (evaluate(c1), evaluate(c2)) {
|
||||
(Ok(c1), Ok(c2)) => {
|
||||
match self
|
||||
.infcx()
|
||||
.at(&obligation.cause, obligation.param_env)
|
||||
.eq(c1, c2)
|
||||
match self.infcx.at(&obligation.cause, obligation.param_env).eq(c1, c2)
|
||||
{
|
||||
Ok(_) => Ok(EvaluatedToOk),
|
||||
Err(_) => Ok(EvaluatedToErr),
|
||||
|
@ -1212,7 +1205,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
}
|
||||
|
||||
let obligation = &stack.obligation;
|
||||
let predicate = self.infcx().resolve_vars_if_possible(obligation.predicate);
|
||||
let predicate = self.infcx.resolve_vars_if_possible(obligation.predicate);
|
||||
|
||||
// Okay to skip binder because of the nature of the
|
||||
// trait-ref-is-knowable check, which does not care about
|
||||
|
@ -1349,9 +1342,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
&mut self,
|
||||
obligation: &TraitObligation<'tcx>,
|
||||
) -> smallvec::SmallVec<[(usize, ty::BoundConstness); 2]> {
|
||||
let poly_trait_predicate = self.infcx().resolve_vars_if_possible(obligation.predicate);
|
||||
let poly_trait_predicate = self.infcx.resolve_vars_if_possible(obligation.predicate);
|
||||
let placeholder_trait_predicate =
|
||||
self.infcx().replace_bound_vars_with_placeholders(poly_trait_predicate);
|
||||
self.infcx.replace_bound_vars_with_placeholders(poly_trait_predicate);
|
||||
debug!(?placeholder_trait_predicate);
|
||||
|
||||
let tcx = self.infcx.tcx;
|
||||
|
@ -2131,7 +2124,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
obligation: &TraitObligation<'tcx>,
|
||||
) -> Result<Normalized<'tcx, SubstsRef<'tcx>>, ()> {
|
||||
let placeholder_obligation =
|
||||
self.infcx().replace_bound_vars_with_placeholders(obligation.predicate);
|
||||
self.infcx.replace_bound_vars_with_placeholders(obligation.predicate);
|
||||
let placeholder_obligation_trait_ref = placeholder_obligation.trait_ref;
|
||||
|
||||
let impl_substs = self.infcx.fresh_substs_for_item(obligation.cause.span, impl_def_id);
|
||||
|
|
|
@ -203,13 +203,13 @@ pub fn impl_subject_and_oblig<'a, 'tcx>(
|
|||
let subject = selcx.tcx().bound_impl_subject(impl_def_id);
|
||||
let subject = subject.subst(selcx.tcx(), impl_substs);
|
||||
let InferOk { value: subject, obligations: normalization_obligations1 } = selcx
|
||||
.infcx()
|
||||
.infcx
|
||||
.partially_normalize_associated_types_in(ObligationCause::dummy(), param_env, subject);
|
||||
|
||||
let predicates = selcx.tcx().predicates_of(impl_def_id);
|
||||
let predicates = predicates.instantiate(selcx.tcx(), impl_substs);
|
||||
let InferOk { value: predicates, obligations: normalization_obligations2 } = selcx
|
||||
.infcx()
|
||||
.infcx
|
||||
.partially_normalize_associated_types_in(ObligationCause::dummy(), param_env, predicates);
|
||||
let impl_obligations =
|
||||
super::predicates_for_generics(|_, _| ObligationCause::dummy(), param_env, predicates);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue