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 52f7384

Browse files
committedJul 6, 2023
Separate select calls that don't need a binder
1 parent 3645345 commit 52f7384

File tree

15 files changed

+58
-44
lines changed

15 files changed

+58
-44
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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
659659
continue;
660660
}
661661
};
662-
match selcx.select(&obligation.with(selcx.tcx(), trait_pred)) {
662+
match selcx.poly_select(&obligation.with(selcx.tcx(), trait_pred)) {
663663
// Uncertain or unimplemented.
664664
Ok(None) => {
665665
if trait_pred.def_id() == unsize_did {

‎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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ 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::TraitPredicate<'tcx>>;
6566
pub type PolyTraitObligation<'tcx> = Obligation<'tcx, ty::PolyTraitPredicate<'tcx>>;
6667

6768
impl<'tcx> PredicateObligation<'tcx> {

‎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_trait_selection/src/solve/eval_ctxt/select.rs

Lines changed: 1 addition & 1 deletion
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, PolyTraitObligation,
7+
Obligation, PolyTraitObligation, PredicateObligation, Selection, SelectionResult,
88
};
99
use rustc_middle::traits::solve::{CanonicalInput, Certainty, Goal};
1010
use rustc_middle::traits::{

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ impl<'tcx> AutoTraitFinder<'tcx> {
9191
let infcx = tcx.infer_ctxt().build();
9292
let mut selcx = SelectionContext::new(&infcx);
9393
for polarity in [true, false] {
94-
let result = selcx.select(&Obligation::new(
94+
let result = selcx.poly_select(&Obligation::new(
9595
tcx,
9696
ObligationCause::dummy(),
9797
orig_env,
@@ -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/fulfill.rs

Lines changed: 2 additions & 2 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, PolyTraitObligation};
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};
@@ -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: 2 additions & 2 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, PolyTraitObligation};
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

@@ -20,7 +20,7 @@ use crate::traits::util;
2020

2121
use super::BuiltinImplConditions;
2222
use super::SelectionCandidate::*;
23-
use super::{SelectionCandidateSet, SelectionContext, PolyTraitObligationStack};
23+
use super::{SelectionCandidateSet, SelectionContext, TraitObligationStack};
2424

2525
impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
2626
#[instrument(skip(self, stack), level = "debug")]

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

Lines changed: 2 additions & 2 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, PolyTraitObligation, Unimplemented,
30+
Obligation, ObligationCause, OutputTypeParameterMismatch, PolyTraitObligation,
31+
PredicateObligation, Selection, SelectionError, TraitNotObjectSafe, Unimplemented,
3232
};
3333

3434
use super::BuiltinImplConditions;

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

Lines changed: 20 additions & 7 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, PolyTraitObligation, 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;
@@ -259,7 +260,7 @@ 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,
264265
obligation: &PolyTraitObligation<'tcx>,
265266
) -> SelectionResult<'tcx, Selection<'tcx>> {
@@ -293,6 +294,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
293294
}
294295
}
295296

297+
pub fn select(
298+
&mut self,
299+
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+
296309
fn select_from_obligation(
297310
&mut self,
298311
obligation: &PolyTraitObligation<'tcx>,
@@ -1471,7 +1484,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
14711484
Ok(Some(candidate))
14721485
}
14731486

1474-
fn is_knowable<'o>(&mut self, stack: &PolyTraitObligationStack<'o, 'tcx>) -> Result<(), Conflict> {
1487+
fn is_knowable<'o>(&mut self, stack: &TraitObligationStack<'o, 'tcx>) -> Result<(), Conflict> {
14751488
debug!("is_knowable(intercrate={:?})", self.is_intercrate());
14761489

14771490
if !self.is_intercrate() || stack.obligation.polarity() == ty::ImplPolarity::Negative {
@@ -2929,9 +2942,9 @@ struct TraitObligationStackList<'o, 'tcx> {
29292942
head: Option<&'o TraitObligationStack<'o, 'tcx>>,
29302943
}
29312944

2932-
impl<'o, 'tcx> PolyTraitObligationStackList<'o, 'tcx> {
2933-
fn empty(cache: &'o ProvisionalEvaluationCache<'tcx>) -> PolyTraitObligationStackList<'o, 'tcx> {
2934-
PolyTraitObligationStackList { cache, head: None }
2945+
impl<'o, 'tcx> TraitObligationStackList<'o, 'tcx> {
2946+
fn empty(cache: &'o ProvisionalEvaluationCache<'tcx>) -> TraitObligationStackList<'o, 'tcx> {
2947+
TraitObligationStackList { cache, head: None }
29352948
}
29362949

29372950
fn with(r: &'o TraitObligationStack<'o, 'tcx>) -> TraitObligationStackList<'o, 'tcx> {

‎compiler/rustc_traits/src/codegen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pub fn codegen_select_candidate<'tcx>(
3535
let obligation_cause = ObligationCause::dummy();
3636
let obligation = Obligation::new(tcx, obligation_cause, param_env, trait_ref);
3737

38-
let selection = match selcx.select(&obligation) {
38+
let selection = match selcx.poly_select(&obligation) {
3939
Ok(Some(selection)) => selection,
4040
Ok(None) => return Err(CodegenObligationError::Ambiguity),
4141
Err(Unimplemented) => return Err(CodegenObligationError::Unimplemented),

0 commit comments

Comments
 (0)
Please sign in to comment.