This extra check of the supertraits is needed for contravariant implementation bounds, because implementation bounds could be supertrait of the type parameter in the trait definition, e.g.:

```
trait A {}
trait B: A {}

trait Foo {
    fn test_fn<T: B>(&self);
}

impl Foo for int {
    fn test_fn<T: B>(&self) {}
}
```
This is tested [here](https://github.com/mozilla/rust/pull/12611/files#diff-d0053de7a1000960dc1cd5d806fa8acaR47).
If bounds should be invariant, then this check can be removed.