Skip to content

Commit 0392366

Browse files
committed
Inline and remove SelectionContext::fast_reject_trait_refs.
Because it has a single call site, and it lets us move a small amount of the work outside the loop.
1 parent 9fa6947 commit 0392366

File tree

2 files changed

+4
-18
lines changed

2 files changed

+4
-18
lines changed

Diff for: compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use hir::LangItem;
1111
use rustc_hir as hir;
1212
use rustc_infer::traits::ObligationCause;
1313
use rustc_infer::traits::{Obligation, SelectionError, TraitObligation};
14-
use rustc_middle::ty::fast_reject::TreatProjections;
14+
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams, TreatProjections};
1515
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
1616

1717
use crate::traits;
@@ -344,6 +344,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
344344
return;
345345
}
346346

347+
let drcx = DeepRejectCtxt { treat_obligation_params: TreatParams::ForLookup };
348+
let obligation_substs = obligation.predicate.skip_binder().trait_ref.substs;
347349
self.tcx().for_each_relevant_impl(
348350
obligation.predicate.def_id(),
349351
obligation.predicate.skip_binder().trait_ref.self_ty(),
@@ -352,7 +354,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
352354
// consider a "quick reject". This avoids creating more types
353355
// and so forth that we need to.
354356
let impl_trait_ref = self.tcx().impl_trait_ref(impl_def_id).unwrap();
355-
if self.fast_reject_trait_refs(obligation, &impl_trait_ref.0) {
357+
if !drcx.substs_refs_may_unify(obligation_substs, impl_trait_ref.0.substs) {
356358
return;
357359
}
358360
if self.reject_fn_ptr_impls(

Diff for: compiler/rustc_trait_selection/src/traits/select/mod.rs

-16
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ use rustc_infer::traits::TraitEngineExt;
4545
use rustc_middle::dep_graph::{DepKind, DepNodeIndex};
4646
use rustc_middle::mir::interpret::ErrorHandled;
4747
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
48-
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
4948
use rustc_middle::ty::fold::BottomUpFolder;
5049
use rustc_middle::ty::relate::TypeRelation;
5150
use rustc_middle::ty::SubstsRef;
@@ -2533,21 +2532,6 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
25332532
Ok(Normalized { value: impl_substs, obligations: nested_obligations })
25342533
}
25352534

2536-
fn fast_reject_trait_refs(
2537-
&mut self,
2538-
obligation: &TraitObligation<'tcx>,
2539-
impl_trait_ref: &ty::TraitRef<'tcx>,
2540-
) -> bool {
2541-
// We can avoid creating type variables and doing the full
2542-
// substitution if we find that any of the input types, when
2543-
// simplified, do not match.
2544-
let drcx = DeepRejectCtxt { treat_obligation_params: TreatParams::ForLookup };
2545-
!drcx.substs_refs_may_unify(
2546-
obligation.predicate.skip_binder().trait_ref.substs,
2547-
impl_trait_ref.substs,
2548-
)
2549-
}
2550-
25512535
/// Normalize `where_clause_trait_ref` and try to match it against
25522536
/// `obligation`. If successful, return any predicates that
25532537
/// result from the normalization.

0 commit comments

Comments
 (0)