summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_error_codes/src/error_codes/E0401.md
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_error_codes/src/error_codes/E0401.md')
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0401.md106
1 files changed, 106 insertions, 0 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes/E0401.md b/compiler/rustc_error_codes/src/error_codes/E0401.md
new file mode 100644
index 000000000..4c93053d5
--- /dev/null
+++ b/compiler/rustc_error_codes/src/error_codes/E0401.md
@@ -0,0 +1,106 @@
+Inner items do not inherit type or const parameters from the functions
+they are embedded in.
+
+Erroneous code example:
+
+```compile_fail,E0401
+fn foo<T>(x: T) {
+ fn bar(y: T) { // T is defined in the "outer" function
+ // ..
+ }
+ bar(x);
+}
+```
+
+Nor will this:
+
+```compile_fail,E0401
+fn foo<T>(x: T) {
+ type MaybeT = Option<T>;
+ // ...
+}
+```
+
+Or this:
+
+```compile_fail,E0401
+fn foo<T>(x: T) {
+ struct Foo {
+ x: T,
+ }
+ // ...
+}
+```
+
+Items inside functions are basically just like top-level items, except
+that they can only be used from the function they are in.
+
+There are a couple of solutions for this.
+
+If the item is a function, you may use a closure:
+
+```
+fn foo<T>(x: T) {
+ let bar = |y: T| { // explicit type annotation may not be necessary
+ // ..
+ };
+ bar(x);
+}
+```
+
+For a generic item, you can copy over the parameters:
+
+```
+fn foo<T>(x: T) {
+ fn bar<T>(y: T) {
+ // ..
+ }
+ bar(x);
+}
+```
+
+```
+fn foo<T>(x: T) {
+ type MaybeT<T> = Option<T>;
+}
+```
+
+Be sure to copy over any bounds as well:
+
+```
+fn foo<T: Copy>(x: T) {
+ fn bar<T: Copy>(y: T) {
+ // ..
+ }
+ bar(x);
+}
+```
+
+```
+fn foo<T: Copy>(x: T) {
+ struct Foo<T: Copy> {
+ x: T,
+ }
+}
+```
+
+This may require additional type hints in the function body.
+
+In case the item is a function inside an `impl`, defining a private helper
+function might be easier:
+
+```
+# struct Foo<T>(T);
+impl<T> Foo<T> {
+ pub fn foo(&self, x: T) {
+ self.bar(x);
+ }
+
+ fn bar(&self, y: T) {
+ // ..
+ }
+}
+```
+
+For default impls in traits, the private helper solution won't work, however
+closures or copying the parameters should still work.