trait Super { type Assoc; } impl Super for () { type Assoc = u8; } trait Sub: Super<Assoc = u16> {} trait BoundOnSelf: Sub {} impl BoundOnSelf for () {} //~^ ERROR the trait bound `(): Sub` is not satisfied trait BoundOnParam<T: Sub> {} impl BoundOnParam<()> for () {} //~^ ERROR the trait bound `(): Sub` is not satisfied trait BoundOnAssoc { type Assoc: Sub; } impl BoundOnAssoc for () { type Assoc = (); //~^ ERROR the trait bound `(): Sub` is not satisfied } trait BoundOnGat where Self::Assoc<u8>: Sub { type Assoc<T>; } impl BoundOnGat for u8 { type Assoc<T> = (); //~^ ERROR the trait bound `(): Sub` is not satisfied } fn trivial_bound() where (): Sub {} //~^ ERROR the trait bound `(): Sub` is not satisfied // The following is an edge case where the unsatisfied projection predicate // `<<u8 as MultiAssoc>::Assoc1<()> as SuperGeneric<u16>>::Assoc == <u8 as MultiAssoc>::Assoc2` // contains both associated types of `MultiAssoc`. To suppress the error about the unsatisfied // super projection, the error's span must be equal to the span of the unsatisfied trait error. trait SuperGeneric<T> { type Assoc; } trait SubGeneric<T>: SuperGeneric<T, Assoc = T> {} trait MultiAssoc where Self::Assoc1<()>: SubGeneric<Self::Assoc2> { type Assoc1<T>; type Assoc2; } impl SuperGeneric<u16> for () { type Assoc = u8; } impl MultiAssoc for u8 { type Assoc1<T> = (); //~^ ERROR the trait bound `(): SubGeneric<u16>` is not satisfied type Assoc2 = u16; } fn main() {}