Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 1a449dc

Browse files
committedJul 7, 2023
Auto merge of #113308 - compiler-errors:poly-select, r=lcnr
Split `SelectionContext::select` into fns that take a binder and don't *most* usages of `SelectionContext::select` don't need to use a binder, but wrap them in a dummy because of the signature. Let's split this out into `SelectionContext::{select,poly_select}` and limit the usages of the latter. Right now, we only have 3 places where we're calling `poly_select` -- fulfillment, internally within the old solver, and the auto-trait finder. r? `@lcnr`
2 parents 921f669 + 3f8919c commit 1a449dc

File tree

21 files changed

+125
-112
lines changed

21 files changed

+125
-112
lines changed
 

‎compiler/rustc_const_eval/src/transform/check_consts/check.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use rustc_middle::mir::visit::{MutatingUseContext, NonMutatingUseContext, PlaceC
1010
use rustc_middle::mir::*;
1111
use rustc_middle::ty::subst::{GenericArgKind, InternalSubsts};
1212
use rustc_middle::ty::{self, adjustment::PointerCast, Instance, InstanceDef, Ty, TyCtxt};
13-
use rustc_middle::ty::{Binder, TraitRef, TypeVisitableExt};
13+
use rustc_middle::ty::{TraitRef, TypeVisitableExt};
1414
use rustc_mir_dataflow::{self, Analysis};
1515
use rustc_span::{sym, Span, Symbol};
1616
use rustc_trait_selection::traits::error_reporting::TypeErrCtxtExt as _;
@@ -755,10 +755,9 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
755755
}
756756

757757
let trait_ref = TraitRef::from_method(tcx, trait_id, substs);
758-
let poly_trait_pred =
759-
Binder::dummy(trait_ref).with_constness(ty::BoundConstness::ConstIfConst);
758+
let trait_ref = trait_ref.with_constness(ty::BoundConstness::ConstIfConst);
760759
let obligation =
761-
Obligation::new(tcx, ObligationCause::dummy(), param_env, poly_trait_pred);
760+
Obligation::new(tcx, ObligationCause::dummy(), param_env, trait_ref);
762761

763762
let implsrc = {
764763
let infcx = tcx.infer_ctxt().build();
@@ -776,11 +775,11 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
776775
}
777776
// Closure: Fn{Once|Mut}
778777
Ok(Some(ImplSource::Builtin(_)))
779-
if poly_trait_pred.self_ty().skip_binder().is_closure()
778+
if trait_ref.self_ty().is_closure()
780779
&& tcx.fn_trait_kind_from_def_id(trait_id).is_some() =>
781780
{
782781
let ty::Closure(closure_def_id, substs) =
783-
*poly_trait_pred.self_ty().no_bound_vars().unwrap().kind()
782+
*trait_ref.self_ty().kind()
784783
else {
785784
unreachable!()
786785
};
@@ -840,7 +839,7 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
840839
tcx,
841840
ObligationCause::dummy_with_span(*fn_span),
842841
param_env,
843-
poly_trait_pred,
842+
trait_ref,
844843
);
845844

846845
// improve diagnostics by showing what failed. Our requirements are stricter this time

‎compiler/rustc_const_eval/src/transform/check_consts/ops.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use rustc_infer::traits::{ImplSource, Obligation, ObligationCause};
1010
use rustc_middle::mir::{self, CallSource};
1111
use rustc_middle::ty::print::with_no_trimmed_paths;
1212
use rustc_middle::ty::subst::{GenericArgKind, SubstsRef};
13+
use rustc_middle::ty::TraitRef;
1314
use rustc_middle::ty::{suggest_constraining_type_param, Adt, Closure, FnDef, FnPtr, Param, Ty};
14-
use rustc_middle::ty::{Binder, TraitRef};
1515
use rustc_middle::util::{call_kind, CallDesugaringKind, CallKind};
1616
use rustc_session::parse::feature_err;
1717
use rustc_span::symbol::sym;
@@ -137,12 +137,8 @@ impl<'tcx> NonConstOp<'tcx> for FnCallNonConst<'tcx> {
137137
}
138138
}
139139
Adt(..) => {
140-
let obligation = Obligation::new(
141-
tcx,
142-
ObligationCause::dummy(),
143-
param_env,
144-
Binder::dummy(trait_ref),
145-
);
140+
let obligation =
141+
Obligation::new(tcx, ObligationCause::dummy(), param_env, trait_ref);
146142

147143
let infcx = tcx.infer_ctxt().build();
148144
let mut selcx = SelectionContext::new(&infcx);

‎compiler/rustc_hir_typeck/src/coercion.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -632,9 +632,8 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
632632
while !queue.is_empty() {
633633
let obligation = queue.remove(0);
634634
debug!("coerce_unsized resolve step: {:?}", obligation);
635-
let bound_predicate = obligation.predicate.kind();
636-
let trait_pred = match bound_predicate.skip_binder() {
637-
ty::PredicateKind::Clause(ty::ClauseKind::Trait(trait_pred))
635+
let trait_pred = match obligation.predicate.kind().no_bound_vars() {
636+
Some(ty::PredicateKind::Clause(ty::ClauseKind::Trait(trait_pred)))
638637
if traits.contains(&trait_pred.def_id()) =>
639638
{
640639
if unsize_did == trait_pred.def_id() {
@@ -652,7 +651,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
652651
has_unsized_tuple_coercion = true;
653652
}
654653
}
655-
bound_predicate.rebind(trait_pred)
654+
trait_pred
656655
}
657656
_ => {
658657
coercion.obligations.push(obligation);
@@ -664,8 +663,8 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
664663
Ok(None) => {
665664
if trait_pred.def_id() == unsize_did {
666665
let trait_pred = self.resolve_vars_if_possible(trait_pred);
667-
let self_ty = trait_pred.skip_binder().self_ty();
668-
let unsize_ty = trait_pred.skip_binder().trait_ref.substs[1].expect_ty();
666+
let self_ty = trait_pred.self_ty();
667+
let unsize_ty = trait_pred.trait_ref.substs[1].expect_ty();
669668
debug!("coerce_unsized: ambiguous unsize case for {:?}", trait_pred);
670669
match (self_ty.kind(), unsize_ty.kind()) {
671670
(&ty::Infer(ty::TyVar(v)), ty::Dynamic(..))

‎compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1982,7 +1982,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
19821982
self.tcx,
19831983
traits::ObligationCause::dummy(),
19841984
self.param_env,
1985-
ty::Binder::dummy(trait_ref),
1985+
trait_ref,
19861986
);
19871987
match SelectionContext::new(&self).select(&obligation) {
19881988
Ok(Some(traits::ImplSource::UserDefined(impl_source))) => {

‎compiler/rustc_hir_typeck/src/method/probe.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,8 +1441,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
14411441
trait_ref: ty::TraitRef<'tcx>,
14421442
) -> traits::SelectionResult<'tcx, traits::Selection<'tcx>> {
14431443
let cause = traits::ObligationCause::misc(self.span, self.body_id);
1444-
let predicate = ty::Binder::dummy(trait_ref);
1445-
let obligation = traits::Obligation::new(self.tcx, cause, self.param_env, predicate);
1444+
let obligation = traits::Obligation::new(self.tcx, cause, self.param_env, trait_ref);
14461445
traits::SelectionContext::new(self).select(&obligation)
14471446
}
14481447

‎compiler/rustc_infer/src/traits/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ impl<'tcx, P> From<Obligation<'tcx, P>> for solve::Goal<'tcx, P> {
6262
}
6363

6464
pub type PredicateObligation<'tcx> = Obligation<'tcx, ty::Predicate<'tcx>>;
65-
pub type TraitObligation<'tcx> = Obligation<'tcx, ty::PolyTraitPredicate<'tcx>>;
65+
pub type TraitObligation<'tcx> = Obligation<'tcx, ty::TraitPredicate<'tcx>>;
66+
pub type PolyTraitObligation<'tcx> = Obligation<'tcx, ty::PolyTraitPredicate<'tcx>>;
6667

6768
impl<'tcx> PredicateObligation<'tcx> {
6869
/// Flips the polarity of the inner predicate.
@@ -86,7 +87,7 @@ impl<'tcx> PredicateObligation<'tcx> {
8687
}
8788
}
8889

89-
impl<'tcx> TraitObligation<'tcx> {
90+
impl<'tcx> PolyTraitObligation<'tcx> {
9091
/// Returns `true` if the trait predicate is considered `const` in its ParamEnv.
9192
pub fn is_const(&self) -> bool {
9293
matches!(
@@ -193,7 +194,7 @@ impl<'tcx> FulfillmentError<'tcx> {
193194
}
194195
}
195196

196-
impl<'tcx> TraitObligation<'tcx> {
197+
impl<'tcx> PolyTraitObligation<'tcx> {
197198
pub fn polarity(&self) -> ty::ImplPolarity {
198199
self.predicate.skip_binder().polarity
199200
}

‎compiler/rustc_middle/src/query/keys.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,11 @@ impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) {
318318
}
319319
}
320320

321-
impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) {
321+
impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::TraitRef<'tcx>) {
322322
type CacheSelector = DefaultCacheSelector<Self>;
323323

324324
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
325-
tcx.def_span(self.1.def_id())
325+
tcx.def_span(self.1.def_id)
326326
}
327327
}
328328

‎compiler/rustc_middle/src/query/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1278,7 +1278,7 @@ rustc_queries! {
12781278
}
12791279

12801280
query codegen_select_candidate(
1281-
key: (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>)
1281+
key: (ty::ParamEnv<'tcx>, ty::TraitRef<'tcx>)
12821282
) -> Result<&'tcx ImplSource<'tcx, ()>, CodegenObligationError> {
12831283
cache_on_disk_if { true }
12841284
desc { |tcx| "computing candidate for `{}`", key.1 }

‎compiler/rustc_middle/src/ty/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,6 +1306,13 @@ impl<'tcx> ToPredicate<'tcx> for TraitRef<'tcx> {
13061306
}
13071307
}
13081308

1309+
impl<'tcx> ToPredicate<'tcx, TraitPredicate<'tcx>> for TraitRef<'tcx> {
1310+
#[inline(always)]
1311+
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> TraitPredicate<'tcx> {
1312+
self.without_const()
1313+
}
1314+
}
1315+
13091316
impl<'tcx> ToPredicate<'tcx, Clause<'tcx>> for TraitRef<'tcx> {
13101317
#[inline(always)]
13111318
fn to_predicate(self, tcx: TyCtxt<'tcx>) -> Clause<'tcx> {

‎compiler/rustc_monomorphize/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ fn custom_coerce_unsize_info<'tcx>(
3131
source_ty: Ty<'tcx>,
3232
target_ty: Ty<'tcx>,
3333
) -> CustomCoerceUnsized {
34-
let trait_ref = ty::Binder::dummy(ty::TraitRef::from_lang_item(
34+
let trait_ref = ty::TraitRef::from_lang_item(
3535
tcx.tcx,
3636
LangItem::CoerceUnsized,
3737
tcx.span,
3838
[source_ty, target_ty],
39-
));
39+
);
4040

4141
match tcx.codegen_select_candidate((ty::ParamEnv::reveal_all(), trait_ref)) {
4242
Ok(traits::ImplSource::UserDefined(traits::ImplSourceUserDefinedData {

‎compiler/rustc_trait_selection/src/solve/eval_ctxt/select.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_hir::def_id::DefId;
44
use rustc_infer::infer::{DefineOpaqueTypes, InferCtxt, InferOk};
55
use rustc_infer::traits::util::supertraits;
66
use rustc_infer::traits::{
7-
Obligation, PredicateObligation, Selection, SelectionResult, TraitObligation,
7+
Obligation, PolyTraitObligation, PredicateObligation, Selection, SelectionResult,
88
};
99
use rustc_middle::traits::solve::{CanonicalInput, Certainty, Goal};
1010
use rustc_middle::traits::{
@@ -23,14 +23,14 @@ use crate::traits::vtable::{count_own_vtable_entries, prepare_vtable_segments, V
2323
pub trait InferCtxtSelectExt<'tcx> {
2424
fn select_in_new_trait_solver(
2525
&self,
26-
obligation: &TraitObligation<'tcx>,
26+
obligation: &PolyTraitObligation<'tcx>,
2727
) -> SelectionResult<'tcx, Selection<'tcx>>;
2828
}
2929

3030
impl<'tcx> InferCtxtSelectExt<'tcx> for InferCtxt<'tcx> {
3131
fn select_in_new_trait_solver(
3232
&self,
33-
obligation: &TraitObligation<'tcx>,
33+
obligation: &PolyTraitObligation<'tcx>,
3434
) -> SelectionResult<'tcx, Selection<'tcx>> {
3535
assert!(self.next_trait_solver());
3636

‎compiler/rustc_trait_selection/src/traits/auto_trait.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,15 @@ impl<'tcx> AutoTraitFinder<'tcx> {
9595
tcx,
9696
ObligationCause::dummy(),
9797
orig_env,
98-
ty::Binder::dummy(ty::TraitPredicate {
98+
ty::TraitPredicate {
9999
trait_ref,
100100
constness: ty::BoundConstness::NotConst,
101101
polarity: if polarity {
102102
ImplPolarity::Positive
103103
} else {
104104
ImplPolarity::Negative
105105
},
106-
}),
106+
},
107107
));
108108
if let Ok(Some(ImplSource::UserDefined(_))) = result {
109109
debug!(
@@ -292,7 +292,7 @@ impl<'tcx> AutoTraitFinder<'tcx> {
292292
new_env,
293293
pred,
294294
));
295-
let result = select.select(&obligation);
295+
let result = select.poly_select(&obligation);
296296

297297
match result {
298298
Ok(Some(ref impl_source)) => {

‎compiler/rustc_trait_selection/src/traits/error_reporting/ambiguity.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rustc_hir::def_id::DefId;
22
use rustc_infer::infer::{InferCtxt, LateBoundRegionConversionTime};
33
use rustc_infer::traits::util::elaborate;
4-
use rustc_infer::traits::{Obligation, ObligationCause, TraitObligation};
4+
use rustc_infer::traits::{Obligation, ObligationCause, PolyTraitObligation};
55
use rustc_middle::ty;
66
use rustc_span::{Span, DUMMY_SP};
77

@@ -14,7 +14,7 @@ pub enum Ambiguity {
1414

1515
pub fn recompute_applicable_impls<'tcx>(
1616
infcx: &InferCtxt<'tcx>,
17-
obligation: &TraitObligation<'tcx>,
17+
obligation: &PolyTraitObligation<'tcx>,
1818
) -> Vec<Ambiguity> {
1919
let tcx = infcx.tcx;
2020
let param_env = obligation.param_env;

‎compiler/rustc_trait_selection/src/traits/fulfill.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_data_structures::obligation_forest::{Error, ForestObligation, Outcome}
44
use rustc_data_structures::obligation_forest::{ObligationForest, ObligationProcessor};
55
use rustc_infer::infer::DefineOpaqueTypes;
66
use rustc_infer::traits::ProjectionCacheKey;
7-
use rustc_infer::traits::{SelectionError, TraitEngine, TraitObligation};
7+
use rustc_infer::traits::{PolyTraitObligation, SelectionError, TraitEngine};
88
use rustc_middle::mir::interpret::ErrorHandled;
99
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
1010
use rustc_middle::ty::error::{ExpectedFound, TypeError};
@@ -667,7 +667,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
667667
fn process_trait_obligation(
668668
&mut self,
669669
obligation: &PredicateObligation<'tcx>,
670-
trait_obligation: TraitObligation<'tcx>,
670+
trait_obligation: PolyTraitObligation<'tcx>,
671671
stalled_on: &mut Vec<TyOrConstInferVar<'tcx>>,
672672
) -> ProcessResult<PendingPredicateObligation<'tcx>, FulfillmentErrorCode<'tcx>> {
673673
let infcx = self.selcx.infcx;
@@ -683,7 +683,7 @@ impl<'a, 'tcx> FulfillProcessor<'a, 'tcx> {
683683
}
684684
}
685685

686-
match self.selcx.select(&trait_obligation) {
686+
match self.selcx.poly_select(&trait_obligation) {
687687
Ok(Some(impl_source)) => {
688688
debug!("selecting trait at depth {} yielded Ok(Some)", obligation.recursion_depth);
689689
ProcessResult::Changed(mk_pending(impl_source.nested_obligations()))

‎compiler/rustc_trait_selection/src/traits/project.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,7 +1545,6 @@ fn assemble_candidate_for_impl_trait_in_trait<'cx, 'tcx>(
15451545
let trait_def_id = tcx.parent(trait_fn_def_id);
15461546
let trait_substs =
15471547
obligation.predicate.substs.truncate_to(tcx, tcx.generics_of(trait_def_id));
1548-
// FIXME(named-returns): Binders
15491548
let trait_predicate = ty::TraitRef::new(tcx, trait_def_id, trait_substs);
15501549

15511550
let _ = selcx.infcx.commit_if_ok(|_| {
@@ -1747,8 +1746,8 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
17471746

17481747
// If we are resolving `<T as TraitRef<...>>::Item == Type`,
17491748
// start out by selecting the predicate `T as TraitRef<...>`:
1750-
let poly_trait_ref = ty::Binder::dummy(obligation.predicate.trait_ref(selcx.tcx()));
1751-
let trait_obligation = obligation.with(selcx.tcx(), poly_trait_ref);
1749+
let trait_ref = obligation.predicate.trait_ref(selcx.tcx());
1750+
let trait_obligation = obligation.with(selcx.tcx(), trait_ref);
17521751
let _ = selcx.infcx.commit_if_ok(|_| {
17531752
let impl_source = match selcx.select(&trait_obligation) {
17541753
Ok(Some(impl_source)) => impl_source,
@@ -1802,7 +1801,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
18021801
if obligation.param_env.reveal() == Reveal::All {
18031802
// NOTE(eddyb) inference variables can resolve to parameters, so
18041803
// assume `poly_trait_ref` isn't monomorphic, if it contains any.
1805-
let poly_trait_ref = selcx.infcx.resolve_vars_if_possible(poly_trait_ref);
1804+
let poly_trait_ref = selcx.infcx.resolve_vars_if_possible(trait_ref);
18061805
!poly_trait_ref.still_further_specializable()
18071806
} else {
18081807
debug!(
@@ -1821,11 +1820,11 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
18211820
let self_ty = selcx.infcx.shallow_resolve(obligation.predicate.self_ty());
18221821

18231822
let lang_items = selcx.tcx().lang_items();
1824-
if [lang_items.gen_trait(), lang_items.future_trait()].contains(&Some(poly_trait_ref.def_id()))
1825-
|| selcx.tcx().fn_trait_kind_from_def_id(poly_trait_ref.def_id()).is_some()
1823+
if [lang_items.gen_trait(), lang_items.future_trait()].contains(&Some(trait_ref.def_id))
1824+
|| selcx.tcx().fn_trait_kind_from_def_id(trait_ref.def_id).is_some()
18261825
{
18271826
true
1828-
} else if lang_items.discriminant_kind_trait() == Some(poly_trait_ref.def_id()) {
1827+
} else if lang_items.discriminant_kind_trait() == Some(trait_ref.def_id) {
18291828
match self_ty.kind() {
18301829
ty::Bool
18311830
| ty::Char
@@ -1860,7 +1859,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
18601859
| ty::Infer(..)
18611860
| ty::Error(_) => false,
18621861
}
1863-
} else if lang_items.pointee_trait() == Some(poly_trait_ref.def_id()) {
1862+
} else if lang_items.pointee_trait() == Some(trait_ref.def_id) {
18641863
let tail = selcx.tcx().struct_tail_with_normalize(
18651864
self_ty,
18661865
|ty| {
@@ -1935,7 +1934,7 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
19351934
}
19361935
}
19371936
} else {
1938-
bug!("unexpected builtin trait with associated type: {poly_trait_ref:?}")
1937+
bug!("unexpected builtin trait with associated type: {trait_ref:?}")
19391938
}
19401939
}
19411940
super::ImplSource::Param(..) => {

‎compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use hir::def_id::DefId;
1010
use hir::LangItem;
1111
use rustc_hir as hir;
1212
use rustc_infer::traits::ObligationCause;
13-
use rustc_infer::traits::{Obligation, SelectionError, TraitObligation};
13+
use rustc_infer::traits::{Obligation, PolyTraitObligation, SelectionError};
1414
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
1515
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
1616

@@ -137,7 +137,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
137137
#[instrument(level = "debug", skip(self, candidates))]
138138
fn assemble_candidates_from_projected_tys(
139139
&mut self,
140-
obligation: &TraitObligation<'tcx>,
140+
obligation: &PolyTraitObligation<'tcx>,
141141
candidates: &mut SelectionCandidateSet<'tcx>,
142142
) {
143143
// Before we go into the whole placeholder thing, just
@@ -206,7 +206,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
206206

207207
fn assemble_generator_candidates(
208208
&mut self,
209-
obligation: &TraitObligation<'tcx>,
209+
obligation: &PolyTraitObligation<'tcx>,
210210
candidates: &mut SelectionCandidateSet<'tcx>,
211211
) {
212212
// Okay to skip binder because the substs on generator types never
@@ -231,7 +231,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
231231

232232
fn assemble_future_candidates(
233233
&mut self,
234-
obligation: &TraitObligation<'tcx>,
234+
obligation: &PolyTraitObligation<'tcx>,
235235
candidates: &mut SelectionCandidateSet<'tcx>,
236236
) {
237237
let self_ty = obligation.self_ty().skip_binder();
@@ -254,7 +254,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
254254
/// unified during the confirmation step.
255255
fn assemble_closure_candidates(
256256
&mut self,
257-
obligation: &TraitObligation<'tcx>,
257+
obligation: &PolyTraitObligation<'tcx>,
258258
candidates: &mut SelectionCandidateSet<'tcx>,
259259
) {
260260
let Some(kind) = self.tcx().fn_trait_kind_from_def_id(obligation.predicate.def_id()) else {
@@ -292,7 +292,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
292292
/// Implements one of the `Fn()` family for a fn pointer.
293293
fn assemble_fn_pointer_candidates(
294294
&mut self,
295-
obligation: &TraitObligation<'tcx>,
295+
obligation: &PolyTraitObligation<'tcx>,
296296
candidates: &mut SelectionCandidateSet<'tcx>,
297297
) {
298298
// We provide impl of all fn traits for fn pointers.
@@ -334,7 +334,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
334334
#[instrument(level = "debug", skip(self, candidates))]
335335
fn assemble_candidates_from_impls(
336336
&mut self,
337-
obligation: &TraitObligation<'tcx>,
337+
obligation: &PolyTraitObligation<'tcx>,
338338
candidates: &mut SelectionCandidateSet<'tcx>,
339339
) {
340340
// Essentially any user-written impl will match with an error type,
@@ -390,7 +390,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
390390
fn reject_fn_ptr_impls(
391391
&mut self,
392392
impl_def_id: DefId,
393-
obligation: &TraitObligation<'tcx>,
393+
obligation: &PolyTraitObligation<'tcx>,
394394
impl_self_ty: Ty<'tcx>,
395395
) -> bool {
396396
// Let `impl<T: FnPtr> Trait for Vec<T>` go through the normal rejection path.
@@ -475,7 +475,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
475475

476476
fn assemble_candidates_from_auto_impls(
477477
&mut self,
478-
obligation: &TraitObligation<'tcx>,
478+
obligation: &PolyTraitObligation<'tcx>,
479479
candidates: &mut SelectionCandidateSet<'tcx>,
480480
) {
481481
// Okay to skip binder here because the tests we do below do not involve bound regions.
@@ -544,7 +544,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
544544
/// Searches for impls that might apply to `obligation`.
545545
fn assemble_candidates_from_object_ty(
546546
&mut self,
547-
obligation: &TraitObligation<'tcx>,
547+
obligation: &PolyTraitObligation<'tcx>,
548548
candidates: &mut SelectionCandidateSet<'tcx>,
549549
) {
550550
debug!(
@@ -668,7 +668,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
668668
/// Searches for unsizing that might apply to `obligation`.
669669
fn assemble_candidates_for_unsizing(
670670
&mut self,
671-
obligation: &TraitObligation<'tcx>,
671+
obligation: &PolyTraitObligation<'tcx>,
672672
candidates: &mut SelectionCandidateSet<'tcx>,
673673
) {
674674
// We currently never consider higher-ranked obligations e.g.
@@ -782,7 +782,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
782782
#[instrument(level = "debug", skip(self, obligation, candidates))]
783783
fn assemble_candidates_for_transmutability(
784784
&mut self,
785-
obligation: &TraitObligation<'tcx>,
785+
obligation: &PolyTraitObligation<'tcx>,
786786
candidates: &mut SelectionCandidateSet<'tcx>,
787787
) {
788788
if obligation.predicate.has_non_region_param() {
@@ -800,7 +800,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
800800
#[instrument(level = "debug", skip(self, obligation, candidates))]
801801
fn assemble_candidates_for_trait_alias(
802802
&mut self,
803-
obligation: &TraitObligation<'tcx>,
803+
obligation: &PolyTraitObligation<'tcx>,
804804
candidates: &mut SelectionCandidateSet<'tcx>,
805805
) {
806806
// Okay to skip binder here because the tests we do below do not involve bound regions.
@@ -837,7 +837,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
837837

838838
fn assemble_const_destruct_candidates(
839839
&mut self,
840-
obligation: &TraitObligation<'tcx>,
840+
obligation: &PolyTraitObligation<'tcx>,
841841
candidates: &mut SelectionCandidateSet<'tcx>,
842842
) {
843843
// If the predicate is `~const Destruct` in a non-const environment, we don't actually need
@@ -924,7 +924,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
924924

925925
fn assemble_candidate_for_tuple(
926926
&mut self,
927-
obligation: &TraitObligation<'tcx>,
927+
obligation: &PolyTraitObligation<'tcx>,
928928
candidates: &mut SelectionCandidateSet<'tcx>,
929929
) {
930930
let self_ty = self.infcx.shallow_resolve(obligation.self_ty().skip_binder());
@@ -966,7 +966,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
966966

967967
fn assemble_candidate_for_pointer_like(
968968
&mut self,
969-
obligation: &TraitObligation<'tcx>,
969+
obligation: &PolyTraitObligation<'tcx>,
970970
candidates: &mut SelectionCandidateSet<'tcx>,
971971
) {
972972
// The regions of a type don't affect the size of the type
@@ -991,7 +991,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
991991

992992
fn assemble_candidates_for_fn_ptr_trait(
993993
&mut self,
994-
obligation: &TraitObligation<'tcx>,
994+
obligation: &PolyTraitObligation<'tcx>,
995995
candidates: &mut SelectionCandidateSet<'tcx>,
996996
) {
997997
let self_ty = self.infcx.shallow_resolve(obligation.self_ty());

‎compiler/rustc_trait_selection/src/traits/select/confirmation.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ use crate::traits::vtable::{
2727
use crate::traits::{
2828
BuiltinDerivedObligation, ImplDerivedObligation, ImplDerivedObligationCause, ImplSource,
2929
ImplSourceObjectData, ImplSourceTraitUpcastingData, ImplSourceUserDefinedData, Normalized,
30-
Obligation, ObligationCause, OutputTypeParameterMismatch, PredicateObligation, Selection,
31-
SelectionError, TraitNotObjectSafe, TraitObligation, Unimplemented,
30+
Obligation, ObligationCause, OutputTypeParameterMismatch, PolyTraitObligation,
31+
PredicateObligation, Selection, SelectionError, TraitNotObjectSafe, Unimplemented,
3232
};
3333

3434
use super::BuiltinImplConditions;
@@ -42,7 +42,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
4242
#[instrument(level = "debug", skip(self))]
4343
pub(super) fn confirm_candidate(
4444
&mut self,
45-
obligation: &TraitObligation<'tcx>,
45+
obligation: &PolyTraitObligation<'tcx>,
4646
candidate: SelectionCandidate<'tcx>,
4747
) -> Result<Selection<'tcx>, SelectionError<'tcx>> {
4848
let mut impl_src = match candidate {
@@ -148,7 +148,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
148148

149149
fn confirm_projection_candidate(
150150
&mut self,
151-
obligation: &TraitObligation<'tcx>,
151+
obligation: &PolyTraitObligation<'tcx>,
152152
idx: usize,
153153
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
154154
let tcx = self.tcx();
@@ -215,7 +215,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
215215

216216
fn confirm_param_candidate(
217217
&mut self,
218-
obligation: &TraitObligation<'tcx>,
218+
obligation: &PolyTraitObligation<'tcx>,
219219
param: ty::PolyTraitRef<'tcx>,
220220
) -> Vec<PredicateObligation<'tcx>> {
221221
debug!(?obligation, ?param, "confirm_param_candidate");
@@ -238,7 +238,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
238238

239239
fn confirm_builtin_candidate(
240240
&mut self,
241-
obligation: &TraitObligation<'tcx>,
241+
obligation: &PolyTraitObligation<'tcx>,
242242
has_nested: bool,
243243
) -> Vec<PredicateObligation<'tcx>> {
244244
debug!(?obligation, ?has_nested, "confirm_builtin_candidate");
@@ -279,13 +279,13 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
279279
#[instrument(level = "debug", skip(self))]
280280
fn confirm_transmutability_candidate(
281281
&mut self,
282-
obligation: &TraitObligation<'tcx>,
282+
obligation: &PolyTraitObligation<'tcx>,
283283
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
284284
use rustc_transmute::{Answer, Condition};
285285
#[instrument(level = "debug", skip(tcx, obligation, predicate))]
286286
fn flatten_answer_tree<'tcx>(
287287
tcx: TyCtxt<'tcx>,
288-
obligation: &TraitObligation<'tcx>,
288+
obligation: &PolyTraitObligation<'tcx>,
289289
predicate: TraitPredicate<'tcx>,
290290
cond: Condition<rustc_transmute::layout::rustc::Ref<'tcx>>,
291291
) -> Vec<PredicateObligation<'tcx>> {
@@ -375,7 +375,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
375375
/// 2. For each where-clause `C` declared on `Foo`, `[Self => X] C` holds.
376376
fn confirm_auto_impl_candidate(
377377
&mut self,
378-
obligation: &TraitObligation<'tcx>,
378+
obligation: &PolyTraitObligation<'tcx>,
379379
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
380380
debug!(?obligation, "confirm_auto_impl_candidate");
381381

@@ -387,7 +387,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
387387
/// See `confirm_auto_impl_candidate`.
388388
fn vtable_auto_impl(
389389
&mut self,
390-
obligation: &TraitObligation<'tcx>,
390+
obligation: &PolyTraitObligation<'tcx>,
391391
trait_def_id: DefId,
392392
nested: ty::Binder<'tcx, Vec<Ty<'tcx>>>,
393393
) -> Vec<PredicateObligation<'tcx>> {
@@ -426,7 +426,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
426426

427427
fn confirm_impl_candidate(
428428
&mut self,
429-
obligation: &TraitObligation<'tcx>,
429+
obligation: &PolyTraitObligation<'tcx>,
430430
impl_def_id: DefId,
431431
) -> ImplSourceUserDefinedData<'tcx, PredicateObligation<'tcx>> {
432432
debug!(?obligation, ?impl_def_id, "confirm_impl_candidate");
@@ -481,7 +481,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
481481

482482
fn confirm_object_candidate(
483483
&mut self,
484-
obligation: &TraitObligation<'tcx>,
484+
obligation: &PolyTraitObligation<'tcx>,
485485
index: usize,
486486
) -> Result<ImplSourceObjectData<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
487487
let tcx = self.tcx();
@@ -655,7 +655,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
655655

656656
fn confirm_fn_pointer_candidate(
657657
&mut self,
658-
obligation: &TraitObligation<'tcx>,
658+
obligation: &PolyTraitObligation<'tcx>,
659659
is_const: bool,
660660
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
661661
debug!(?obligation, "confirm_fn_pointer_candidate");
@@ -714,7 +714,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
714714

715715
fn confirm_trait_alias_candidate(
716716
&mut self,
717-
obligation: &TraitObligation<'tcx>,
717+
obligation: &PolyTraitObligation<'tcx>,
718718
) -> Vec<PredicateObligation<'tcx>> {
719719
debug!(?obligation, "confirm_trait_alias_candidate");
720720

@@ -739,7 +739,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
739739

740740
fn confirm_generator_candidate(
741741
&mut self,
742-
obligation: &TraitObligation<'tcx>,
742+
obligation: &PolyTraitObligation<'tcx>,
743743
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
744744
// Okay to skip binder because the substs on generator types never
745745
// touch bound regions, they just capture the in-scope
@@ -778,7 +778,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
778778

779779
fn confirm_future_candidate(
780780
&mut self,
781-
obligation: &TraitObligation<'tcx>,
781+
obligation: &PolyTraitObligation<'tcx>,
782782
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
783783
// Okay to skip binder because the substs on generator types never
784784
// touch bound regions, they just capture the in-scope
@@ -809,7 +809,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
809809
#[instrument(skip(self), level = "debug")]
810810
fn confirm_closure_candidate(
811811
&mut self,
812-
obligation: &TraitObligation<'tcx>,
812+
obligation: &PolyTraitObligation<'tcx>,
813813
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
814814
let kind = self
815815
.tcx()
@@ -865,7 +865,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
865865
#[instrument(skip(self), level = "trace")]
866866
fn confirm_poly_trait_refs(
867867
&mut self,
868-
obligation: &TraitObligation<'tcx>,
868+
obligation: &PolyTraitObligation<'tcx>,
869869
self_ty_trait_ref: ty::PolyTraitRef<'tcx>,
870870
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
871871
let obligation_trait_ref = obligation.predicate.to_poly_trait_ref();
@@ -900,7 +900,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
900900

901901
fn confirm_trait_upcasting_unsize_candidate(
902902
&mut self,
903-
obligation: &TraitObligation<'tcx>,
903+
obligation: &PolyTraitObligation<'tcx>,
904904
idx: usize,
905905
) -> Result<ImplSourceTraitUpcastingData<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
906906
let tcx = self.tcx();
@@ -1004,7 +1004,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
10041004

10051005
fn confirm_builtin_unsize_candidate(
10061006
&mut self,
1007-
obligation: &TraitObligation<'tcx>,
1007+
obligation: &PolyTraitObligation<'tcx>,
10081008
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
10091009
let tcx = self.tcx();
10101010

@@ -1213,7 +1213,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
12131213

12141214
fn confirm_const_destruct_candidate(
12151215
&mut self,
1216-
obligation: &TraitObligation<'tcx>,
1216+
obligation: &PolyTraitObligation<'tcx>,
12171217
impl_def_id: Option<DefId>,
12181218
) -> Result<Vec<PredicateObligation<'tcx>>, SelectionError<'tcx>> {
12191219
// `~const Destruct` in a non-const environment is always trivially true, since our type is `Drop`

‎compiler/rustc_trait_selection/src/traits/select/mod.rs

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ use super::util::closure_trait_ref_and_return_type;
1515
use super::wf;
1616
use super::{
1717
ErrorReporting, ImplDerivedObligation, ImplDerivedObligationCause, Normalized, Obligation,
18-
ObligationCause, ObligationCauseCode, Overflow, PredicateObligation, Selection, SelectionError,
19-
SelectionResult, TraitObligation, TraitQueryMode,
18+
ObligationCause, ObligationCauseCode, Overflow, PolyTraitObligation, PredicateObligation,
19+
Selection, SelectionError, SelectionResult, TraitQueryMode,
2020
};
2121

2222
use crate::infer::{InferCtxt, InferOk, TypeFreshener};
@@ -34,6 +34,7 @@ use rustc_hir as hir;
3434
use rustc_hir::def_id::DefId;
3535
use rustc_infer::infer::DefineOpaqueTypes;
3636
use rustc_infer::infer::LateBoundRegionConversionTime;
37+
use rustc_infer::traits::TraitObligation;
3738
use rustc_middle::dep_graph::{DepKind, DepNodeIndex};
3839
use rustc_middle::mir::interpret::ErrorHandled;
3940
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
@@ -122,7 +123,7 @@ pub struct SelectionContext<'cx, 'tcx> {
122123

123124
// A stack that walks back up the stack frame.
124125
struct TraitObligationStack<'prev, 'tcx> {
125-
obligation: &'prev TraitObligation<'tcx>,
126+
obligation: &'prev PolyTraitObligation<'tcx>,
126127

127128
/// The trait predicate from `obligation` but "freshened" with the
128129
/// selection-context's freshener. Used to check for recursion.
@@ -259,9 +260,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
259260
/// Attempts to satisfy the obligation. If successful, this will affect the surrounding
260261
/// type environment by performing unification.
261262
#[instrument(level = "debug", skip(self), ret)]
262-
pub fn select(
263+
pub fn poly_select(
263264
&mut self,
264-
obligation: &TraitObligation<'tcx>,
265+
obligation: &PolyTraitObligation<'tcx>,
265266
) -> SelectionResult<'tcx, Selection<'tcx>> {
266267
if self.infcx.next_trait_solver() {
267268
return self.infcx.select_in_new_trait_solver(obligation);
@@ -293,9 +294,21 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
293294
}
294295
}
295296

296-
fn select_from_obligation(
297+
pub fn select(
297298
&mut self,
298299
obligation: &TraitObligation<'tcx>,
300+
) -> SelectionResult<'tcx, Selection<'tcx>> {
301+
self.poly_select(&Obligation {
302+
cause: obligation.cause.clone(),
303+
param_env: obligation.param_env,
304+
predicate: ty::Binder::dummy(obligation.predicate),
305+
recursion_depth: obligation.recursion_depth,
306+
})
307+
}
308+
309+
fn select_from_obligation(
310+
&mut self,
311+
obligation: &PolyTraitObligation<'tcx>,
299312
) -> SelectionResult<'tcx, SelectionCandidate<'tcx>> {
300313
debug_assert!(!obligation.predicate.has_escaping_bound_vars());
301314

@@ -612,7 +625,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
612625
obligation: PredicateObligation<'tcx>,
613626
) -> Result<EvaluationResult, OverflowError> {
614627
debug_assert!(!self.infcx.next_trait_solver());
615-
// `previous_stack` stores a `TraitObligation`, while `obligation` is
628+
// `previous_stack` stores a `PolyTraitObligation`, while `obligation` is
616629
// a `PredicateObligation`. These are distinct types, so we can't
617630
// use any `Option` combinator method that would force them to be
618631
// the same.
@@ -973,7 +986,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
973986
fn evaluate_trait_predicate_recursively<'o>(
974987
&mut self,
975988
previous_stack: TraitObligationStackList<'o, 'tcx>,
976-
mut obligation: TraitObligation<'tcx>,
989+
mut obligation: PolyTraitObligation<'tcx>,
977990
) -> Result<EvaluationResult, OverflowError> {
978991
if !self.is_intercrate()
979992
&& obligation.is_global()
@@ -1379,7 +1392,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
13791392
fn filter_impls(
13801393
&mut self,
13811394
candidates: Vec<SelectionCandidate<'tcx>>,
1382-
obligation: &TraitObligation<'tcx>,
1395+
obligation: &PolyTraitObligation<'tcx>,
13831396
) -> Vec<SelectionCandidate<'tcx>> {
13841397
trace!("{candidates:#?}");
13851398
let tcx = self.tcx();
@@ -1442,7 +1455,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
14421455
fn filter_reservation_impls(
14431456
&mut self,
14441457
candidate: SelectionCandidate<'tcx>,
1445-
obligation: &TraitObligation<'tcx>,
1458+
obligation: &PolyTraitObligation<'tcx>,
14461459
) -> SelectionResult<'tcx, SelectionCandidate<'tcx>> {
14471460
let tcx = self.tcx();
14481461
// Treat reservation impls as ambiguity.
@@ -1614,7 +1627,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
16141627
#[instrument(level = "debug", skip(self), ret)]
16151628
fn match_projection_obligation_against_definition_bounds(
16161629
&mut self,
1617-
obligation: &TraitObligation<'tcx>,
1630+
obligation: &PolyTraitObligation<'tcx>,
16181631
) -> smallvec::SmallVec<[(usize, ty::BoundConstness); 2]> {
16191632
let poly_trait_predicate = self.infcx.resolve_vars_if_possible(obligation.predicate);
16201633
let placeholder_trait_predicate =
@@ -1677,7 +1690,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
16771690
/// variables or placeholders, the normalized bound is returned.
16781691
fn match_normalize_trait_ref(
16791692
&mut self,
1680-
obligation: &TraitObligation<'tcx>,
1693+
obligation: &PolyTraitObligation<'tcx>,
16811694
trait_bound: ty::PolyTraitRef<'tcx>,
16821695
placeholder_trait_ref: ty::TraitRef<'tcx>,
16831696
) -> Result<Option<ty::PolyTraitRef<'tcx>>, ()> {
@@ -2078,7 +2091,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
20782091
impl<'tcx> SelectionContext<'_, 'tcx> {
20792092
fn sized_conditions(
20802093
&mut self,
2081-
obligation: &TraitObligation<'tcx>,
2094+
obligation: &PolyTraitObligation<'tcx>,
20822095
) -> BuiltinImplConditions<'tcx> {
20832096
use self::BuiltinImplConditions::{Ambiguous, None, Where};
20842097

@@ -2138,7 +2151,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
21382151

21392152
fn copy_clone_conditions(
21402153
&mut self,
2141-
obligation: &TraitObligation<'tcx>,
2154+
obligation: &PolyTraitObligation<'tcx>,
21422155
) -> BuiltinImplConditions<'tcx> {
21432156
// NOTE: binder moved to (*)
21442157
let self_ty = self.infcx.shallow_resolve(obligation.predicate.skip_binder().self_ty());
@@ -2414,7 +2427,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
24142427
fn rematch_impl(
24152428
&mut self,
24162429
impl_def_id: DefId,
2417-
obligation: &TraitObligation<'tcx>,
2430+
obligation: &PolyTraitObligation<'tcx>,
24182431
) -> Normalized<'tcx, SubstsRef<'tcx>> {
24192432
let impl_trait_ref = self.tcx().impl_trait_ref(impl_def_id).unwrap();
24202433
match self.match_impl(impl_def_id, impl_trait_ref, obligation) {
@@ -2452,7 +2465,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
24522465
&mut self,
24532466
impl_def_id: DefId,
24542467
impl_trait_ref: EarlyBinder<ty::TraitRef<'tcx>>,
2455-
obligation: &TraitObligation<'tcx>,
2468+
obligation: &PolyTraitObligation<'tcx>,
24562469
) -> Result<Normalized<'tcx, SubstsRef<'tcx>>, ()> {
24572470
let placeholder_obligation =
24582471
self.infcx.instantiate_binder_with_placeholders(obligation.predicate);
@@ -2510,7 +2523,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
25102523
/// result from the normalization.
25112524
fn match_where_clause_trait_ref(
25122525
&mut self,
2513-
obligation: &TraitObligation<'tcx>,
2526+
obligation: &PolyTraitObligation<'tcx>,
25142527
where_clause_trait_ref: ty::PolyTraitRef<'tcx>,
25152528
) -> Result<Vec<PredicateObligation<'tcx>>, ()> {
25162529
self.match_poly_trait_ref(obligation, where_clause_trait_ref)
@@ -2521,7 +2534,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
25212534
#[instrument(skip(self), level = "debug")]
25222535
fn match_poly_trait_ref(
25232536
&mut self,
2524-
obligation: &TraitObligation<'tcx>,
2537+
obligation: &PolyTraitObligation<'tcx>,
25252538
poly_trait_ref: ty::PolyTraitRef<'tcx>,
25262539
) -> Result<Vec<PredicateObligation<'tcx>>, ()> {
25272540
self.infcx
@@ -2547,7 +2560,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
25472560
fn push_stack<'o>(
25482561
&mut self,
25492562
previous_stack: TraitObligationStackList<'o, 'tcx>,
2550-
obligation: &'o TraitObligation<'tcx>,
2563+
obligation: &'o PolyTraitObligation<'tcx>,
25512564
) -> TraitObligationStack<'o, 'tcx> {
25522565
let fresh_trait_pred = obligation.predicate.fold_with(&mut self.freshener);
25532566

@@ -2566,7 +2579,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
25662579
#[instrument(skip(self), level = "debug")]
25672580
fn closure_trait_ref_unnormalized(
25682581
&mut self,
2569-
obligation: &TraitObligation<'tcx>,
2582+
obligation: &PolyTraitObligation<'tcx>,
25702583
substs: SubstsRef<'tcx>,
25712584
) -> ty::PolyTraitRef<'tcx> {
25722585
let closure_sig = substs.as_closure().sig();

‎compiler/rustc_trait_selection/src/traits/vtable.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ pub(crate) fn vtable_trait_upcasting_coercion_new_vptr_slot<'tcx>(
362362

363363
let trait_ref = ty::TraitRef::new(tcx, unsize_trait_did, [source, target]);
364364

365-
match tcx.codegen_select_candidate((ty::ParamEnv::reveal_all(), ty::Binder::dummy(trait_ref))) {
365+
match tcx.codegen_select_candidate((ty::ParamEnv::reveal_all(), trait_ref)) {
366366
Ok(ImplSource::TraitUpcasting(implsrc_traitcasting)) => {
367367
implsrc_traitcasting.vtable_vptr_slot
368368
}

‎compiler/rustc_traits/src/codegen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use rustc_trait_selection::traits::{
2222
/// This also expects that `trait_ref` is fully normalized.
2323
pub fn codegen_select_candidate<'tcx>(
2424
tcx: TyCtxt<'tcx>,
25-
(param_env, trait_ref): (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>),
25+
(param_env, trait_ref): (ty::ParamEnv<'tcx>, ty::TraitRef<'tcx>),
2626
) -> Result<&'tcx ImplSource<'tcx, ()>, CodegenObligationError> {
2727
// We expect the input to be fully normalized.
2828
debug_assert_eq!(trait_ref, tcx.normalize_erasing_regions(param_env, trait_ref));

‎compiler/rustc_ty_utils/src/instance.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ fn resolve_associated_item<'tcx>(
8080

8181
let trait_ref = ty::TraitRef::from_method(tcx, trait_id, rcvr_substs);
8282

83-
let vtbl = match tcx.codegen_select_candidate((param_env, ty::Binder::dummy(trait_ref))) {
83+
let vtbl = match tcx.codegen_select_candidate((param_env, trait_ref)) {
8484
Ok(vtbl) => vtbl,
8585
Err(CodegenObligationError::Ambiguity) => {
8686
let reported = tcx.sess.delay_span_bug(

0 commit comments

Comments
 (0)
Please sign in to comment.