fn trait_predicates_eq<'tcx>(
    tcx: TyCtxt<'tcx>,
    predicate1: Predicate<'tcx>,
    predicate2: Predicate<'tcx>,
    span: Span
) -> bool
Expand description

Checks if some predicate on the specializing impl (predicate1) is the same as some predicate on the base impl (predicate2).

This basically just checks syntactic equivalence, but is a little more forgiving since we want to equate T: Tr with T: ~const Tr so this can work:

#[rustc_specialization_trait]
trait Specialize { }

impl<T: Bound> Tr for T { }
impl<T: ~const Bound + Specialize> const Tr for T { }

However, we don’t want to allow the reverse, i.e., when the bound on the specializing impl is not as const as the bound on the base impl:

impl<T: ~const Bound> const Tr for T { }
impl<T: Bound + Specialize> const Tr for T { } // should be T: ~const Bound

So we make that check in this function and try to raise a helpful error message.