pub trait Element { type Array; } impl Element<()> for T { type Array = T; } impl, S> Element<[S; 3]> for T { type Array = [T::Array; 3]; } trait Foo where u8: Element, { fn foo(self, x: >::Array); } impl Foo for u16 where u8: Element, { fn foo(self, _: >::Array) {} } fn main() { let b: [u8; 3] = [0u8; 3]; 0u16.foo(b); //~ ERROR type annotations needed //~^ ERROR type annotations needed //>::foo(0u16, b); }