short-circuit when proj def ids differ
This commit is contained in:
parent
1bb6ae5874
commit
4cc659eb3f
2 changed files with 20 additions and 14 deletions
|
@ -625,8 +625,13 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
||||||
// in b_ty's bound. Use this to first determine *which* apply without
|
// in b_ty's bound. Use this to first determine *which* apply without
|
||||||
// having any inference side-effects. We process obligations because
|
// having any inference side-effects. We process obligations because
|
||||||
// unification may initially succeed due to deferred projection equality.
|
// unification may initially succeed due to deferred projection equality.
|
||||||
let projection_may_match = |ecx: &mut Self, source_projection, target_projection| {
|
let projection_may_match =
|
||||||
ecx.probe(|_| CandidateKind::UpcastProbe)
|
|ecx: &mut Self,
|
||||||
|
source_projection: ty::PolyExistentialProjection<'tcx>,
|
||||||
|
target_projection: ty::PolyExistentialProjection<'tcx>| {
|
||||||
|
source_projection.item_def_id() == target_projection.item_def_id()
|
||||||
|
&& ecx
|
||||||
|
.probe(|_| CandidateKind::UpcastProbe)
|
||||||
.enter(|ecx| -> Result<(), NoSolution> {
|
.enter(|ecx| -> Result<(), NoSolution> {
|
||||||
ecx.eq(param_env, source_projection, target_projection)?;
|
ecx.eq(param_env, source_projection, target_projection)?;
|
||||||
let _ = ecx.try_evaluate_added_goals()?;
|
let _ = ecx.try_evaluate_added_goals()?;
|
||||||
|
|
|
@ -920,7 +920,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
a_data.projection_bounds().filter(|source_projection| {
|
a_data.projection_bounds().filter(|source_projection| {
|
||||||
// Eager normalization means that we can just use can_eq
|
// Eager normalization means that we can just use can_eq
|
||||||
// here instead of equating and processing obligations.
|
// here instead of equating and processing obligations.
|
||||||
self.infcx.can_eq(
|
source_projection.item_def_id() == target_projection.item_def_id()
|
||||||
|
&& self.infcx.can_eq(
|
||||||
obligation.param_env,
|
obligation.param_env,
|
||||||
*source_projection,
|
*source_projection,
|
||||||
target_projection,
|
target_projection,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue