A type that is not a trait was used in a trait position, such as a bound or `impl`. Erroneous code example: ```compile_fail,E0404 struct Foo; struct Bar; impl Foo for Bar {} // error: `Foo` is not a trait fn baz(t: T) {} // error: `Foo` is not a trait ``` Another erroneous code example: ```compile_fail,E0404 type Foo = Iterator; fn bar(t: T) {} // error: `Foo` is a type alias ``` Please verify that the trait's name was not misspelled or that the right identifier was used. Example: ``` trait Foo { // some functions } struct Bar; impl Foo for Bar { // ok! // functions implementation } fn baz(t: T) {} // ok! ``` Alternatively, you could introduce a new trait with your desired restrictions as a super trait: ``` # trait Foo {} # struct Bar; # impl Foo for Bar {} trait Qux: Foo {} // Anything that implements Qux also needs to implement Foo fn baz(t: T) {} // also ok! ``` Finally, if you are on nightly and want to use a trait alias instead of a type alias, you should use `#![feature(trait_alias)]`: ``` #![feature(trait_alias)] trait Foo = Iterator; fn bar(t: T) {} // ok! ```