Skip to content

Commit 40f9dcc

Browse files
committed
Use can_eq instead of Ty<'_> == Ty<'_>
1 parent 89a3c19 commit 40f9dcc

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -426,17 +426,25 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
426426
let (main_trait_predicate, o) = if let ty::PredicateKind::Clause(
427427
ty::ClauseKind::Trait(root_pred)
428428
) = root_obligation.predicate.kind().skip_binder()
429+
&& !trait_predicate.self_ty().skip_binder().has_escaping_bound_vars()
430+
&& !root_pred.self_ty().has_escaping_bound_vars()
429431
// The type of the leaf predicate is (roughly) the same as the type
430432
// from the root predicate, as a proxy for "we care about the root"
431433
// FIXME: this doesn't account for trivial derefs, but works as a first
432434
// approximation.
433435
&& (
434436
// `T: Trait` && `&&T: OtherTrait`, we want `OtherTrait`
435-
trait_predicate.self_ty().skip_binder()
436-
== root_pred.self_ty().peel_refs()
437+
self.can_eq(
438+
obligation.param_env,
439+
trait_predicate.self_ty().skip_binder(),
440+
root_pred.self_ty().peel_refs(),
441+
)
437442
// `&str: Iterator` && `&str: IntoIterator`, we want `IntoIterator`
438-
|| trait_predicate.self_ty().skip_binder()
439-
== root_pred.self_ty()
443+
|| self.can_eq(
444+
obligation.param_env,
445+
trait_predicate.self_ty().skip_binder(),
446+
root_pred.self_ty(),
447+
)
440448
)
441449
// The leaf trait and the root trait are different, so as to avoid
442450
// talking about `&mut T: Trait` and instead remain talking about

0 commit comments

Comments
 (0)