summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_error_codes/src/error_codes/E0404.md
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_error_codes/src/error_codes/E0404.md')
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0404.md57
1 files changed, 57 insertions, 0 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes/E0404.md b/compiler/rustc_error_codes/src/error_codes/E0404.md
new file mode 100644
index 000000000..d6fa51e61
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0404.md
@@ -0,0 +1,57 @@
+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: Foo>(t: T) {} // error: `Foo` is not a trait
+```
+
+Another erroneous code example:
+
+```compile_fail,E0404
+type Foo = Iterator<Item=String>;
+
+fn bar<T: Foo>(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: Foo>(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: Qux>(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<Item=String>;
+
+fn bar<T: Foo>(t: T) {} // ok!
+```