]> git.lizzy.rs Git - rust.git/blob - src/librustc_resolve/error_codes.rs
Rollup merge of #63055 - Mark-Simulacrum:save-analysis-clean-2, r=Xanewok
[rust.git] / src / librustc_resolve / error_codes.rs
1 use syntax::{register_diagnostics, register_long_diagnostics};
2
3 // Error messages for EXXXX errors.  Each message should start and end with a
4 // new line, and be wrapped to 80 characters.  In vim you can `:set tw=80` and
5 // use `gq` to wrap paragraphs. Use `:set tw=0` to disable.
6 register_long_diagnostics! {
7
8 E0128: r##"
9 Type parameter defaults can only use parameters that occur before them.
10 Erroneous code example:
11
12 ```compile_fail,E0128
13 struct Foo<T=U, U=()> {
14     field1: T,
15     filed2: U,
16 }
17 // error: type parameters with a default cannot use forward declared
18 // identifiers
19 ```
20
21 Since type parameters are evaluated in-order, you may be able to fix this issue
22 by doing:
23
24 ```
25 struct Foo<U=(), T=U> {
26     field1: T,
27     filed2: U,
28 }
29 ```
30
31 Please also verify that this wasn't because of a name-clash and rename the type
32 parameter if so.
33 "##,
34
35 E0154: r##"
36 #### Note: this error code is no longer emitted by the compiler.
37
38 Imports (`use` statements) are not allowed after non-item statements, such as
39 variable declarations and expression statements.
40
41 Here is an example that demonstrates the error:
42
43 ```
44 fn f() {
45     // Variable declaration before import
46     let x = 0;
47     use std::io::Read;
48     // ...
49 }
50 ```
51
52 The solution is to declare the imports at the top of the block, function, or
53 file.
54
55 Here is the previous example again, with the correct order:
56
57 ```
58 fn f() {
59     use std::io::Read;
60     let x = 0;
61     // ...
62 }
63 ```
64
65 See the Declaration Statements section of the reference for more information
66 about what constitutes an Item declaration and what does not:
67
68 https://doc.rust-lang.org/reference.html#statements
69 "##,
70
71 E0251: r##"
72 #### Note: this error code is no longer emitted by the compiler.
73
74 Two items of the same name cannot be imported without rebinding one of the
75 items under a new local name.
76
77 An example of this error:
78
79 ```
80 use foo::baz;
81 use bar::*; // error, do `use foo::baz as quux` instead on the previous line
82
83 fn main() {}
84
85 mod foo {
86     pub struct baz;
87 }
88
89 mod bar {
90     pub mod baz {}
91 }
92 ```
93 "##,
94
95 E0252: r##"
96 Two items of the same name cannot be imported without rebinding one of the
97 items under a new local name.
98
99 Erroneous code example:
100
101 ```compile_fail,E0252
102 use foo::baz;
103 use bar::baz; // error, do `use bar::baz as quux` instead
104
105 fn main() {}
106
107 mod foo {
108     pub struct baz;
109 }
110
111 mod bar {
112     pub mod baz {}
113 }
114 ```
115
116 You can use aliases in order to fix this error. Example:
117
118 ```
119 use foo::baz as foo_baz;
120 use bar::baz; // ok!
121
122 fn main() {}
123
124 mod foo {
125     pub struct baz;
126 }
127
128 mod bar {
129     pub mod baz {}
130 }
131 ```
132
133 Or you can reference the item with its parent:
134
135 ```
136 use bar::baz;
137
138 fn main() {
139     let x = foo::baz; // ok!
140 }
141
142 mod foo {
143     pub struct baz;
144 }
145
146 mod bar {
147     pub mod baz {}
148 }
149 ```
150 "##,
151
152 E0253: r##"
153 Attempt was made to import an unimportable value. This can happen when trying
154 to import a method from a trait.
155
156 Erroneous code example:
157
158 ```compile_fail,E0253
159 mod foo {
160     pub trait MyTrait {
161         fn do_something();
162     }
163 }
164
165 use foo::MyTrait::do_something;
166 // error: `do_something` is not directly importable
167
168 fn main() {}
169 ```
170
171 It's invalid to directly import methods belonging to a trait or concrete type.
172 "##,
173
174 E0254: r##"
175 Attempt was made to import an item whereas an extern crate with this name has
176 already been imported.
177
178 Erroneous code example:
179
180 ```compile_fail,E0254
181 extern crate core;
182
183 mod foo {
184     pub trait core {
185         fn do_something();
186     }
187 }
188
189 use foo::core;  // error: an extern crate named `core` has already
190                 //        been imported in this module
191
192 fn main() {}
193 ```
194
195 To fix this issue, you have to rename at least one of the two imports.
196 Example:
197
198 ```
199 extern crate core as libcore; // ok!
200
201 mod foo {
202     pub trait core {
203         fn do_something();
204     }
205 }
206
207 use foo::core;
208
209 fn main() {}
210 ```
211 "##,
212
213 E0255: r##"
214 You can't import a value whose name is the same as another value defined in the
215 module.
216
217 Erroneous code example:
218
219 ```compile_fail,E0255
220 use bar::foo; // error: an item named `foo` is already in scope
221
222 fn foo() {}
223
224 mod bar {
225      pub fn foo() {}
226 }
227
228 fn main() {}
229 ```
230
231 You can use aliases in order to fix this error. Example:
232
233 ```
234 use bar::foo as bar_foo; // ok!
235
236 fn foo() {}
237
238 mod bar {
239      pub fn foo() {}
240 }
241
242 fn main() {}
243 ```
244
245 Or you can reference the item with its parent:
246
247 ```
248 fn foo() {}
249
250 mod bar {
251      pub fn foo() {}
252 }
253
254 fn main() {
255     bar::foo(); // we get the item by referring to its parent
256 }
257 ```
258 "##,
259
260 E0256: r##"
261 #### Note: this error code is no longer emitted by the compiler.
262
263 You can't import a type or module when the name of the item being imported is
264 the same as another type or submodule defined in the module.
265
266 An example of this error:
267
268 ```compile_fail
269 use foo::Bar; // error
270
271 type Bar = u32;
272
273 mod foo {
274     pub mod Bar { }
275 }
276
277 fn main() {}
278 ```
279 "##,
280
281 E0259: r##"
282 The name chosen for an external crate conflicts with another external crate
283 that has been imported into the current module.
284
285 Erroneous code example:
286
287 ```compile_fail,E0259
288 extern crate core;
289 extern crate std as core;
290
291 fn main() {}
292 ```
293
294 The solution is to choose a different name that doesn't conflict with any
295 external crate imported into the current module.
296
297 Correct example:
298
299 ```
300 extern crate core;
301 extern crate std as other_name;
302
303 fn main() {}
304 ```
305 "##,
306
307 E0260: r##"
308 The name for an item declaration conflicts with an external crate's name.
309
310 Erroneous code example:
311
312 ```compile_fail,E0260
313 extern crate core;
314
315 struct core;
316
317 fn main() {}
318 ```
319
320 There are two possible solutions:
321
322 Solution #1: Rename the item.
323
324 ```
325 extern crate core;
326
327 struct xyz;
328 ```
329
330 Solution #2: Import the crate with a different name.
331
332 ```
333 extern crate core as xyz;
334
335 struct abc;
336 ```
337
338 See the Declaration Statements section of the reference for more information
339 about what constitutes an Item declaration and what does not:
340
341 https://doc.rust-lang.org/reference.html#statements
342 "##,
343
344 E0364: r##"
345 Private items cannot be publicly re-exported. This error indicates that you
346 attempted to `pub use` a type or value that was not itself public.
347
348 Erroneous code example:
349
350 ```compile_fail
351 mod foo {
352     const X: u32 = 1;
353 }
354
355 pub use foo::X;
356
357 fn main() {}
358 ```
359
360 The solution to this problem is to ensure that the items that you are
361 re-exporting are themselves marked with `pub`:
362
363 ```
364 mod foo {
365     pub const X: u32 = 1;
366 }
367
368 pub use foo::X;
369
370 fn main() {}
371 ```
372
373 See the 'Use Declarations' section of the reference for more information on
374 this topic:
375
376 https://doc.rust-lang.org/reference.html#use-declarations
377 "##,
378
379 E0365: r##"
380 Private modules cannot be publicly re-exported. This error indicates that you
381 attempted to `pub use` a module that was not itself public.
382
383 Erroneous code example:
384
385 ```compile_fail,E0365
386 mod foo {
387     pub const X: u32 = 1;
388 }
389
390 pub use foo as foo2;
391
392 fn main() {}
393 ```
394
395 The solution to this problem is to ensure that the module that you are
396 re-exporting is itself marked with `pub`:
397
398 ```
399 pub mod foo {
400     pub const X: u32 = 1;
401 }
402
403 pub use foo as foo2;
404
405 fn main() {}
406 ```
407
408 See the 'Use Declarations' section of the reference for more information
409 on this topic:
410
411 https://doc.rust-lang.org/reference.html#use-declarations
412 "##,
413
414 E0401: r##"
415 Inner items do not inherit type or const parameters from the functions
416 they are embedded in.
417
418 Erroneous code example:
419
420 ```compile_fail,E0401
421 fn foo<T>(x: T) {
422     fn bar(y: T) { // T is defined in the "outer" function
423         // ..
424     }
425     bar(x);
426 }
427 ```
428
429 Nor will this:
430
431 ```compile_fail,E0401
432 fn foo<T>(x: T) {
433     type MaybeT = Option<T>;
434     // ...
435 }
436 ```
437
438 Or this:
439
440 ```compile_fail,E0401
441 fn foo<T>(x: T) {
442     struct Foo {
443         x: T,
444     }
445     // ...
446 }
447 ```
448
449 Items inside functions are basically just like top-level items, except
450 that they can only be used from the function they are in.
451
452 There are a couple of solutions for this.
453
454 If the item is a function, you may use a closure:
455
456 ```
457 fn foo<T>(x: T) {
458     let bar = |y: T| { // explicit type annotation may not be necessary
459         // ..
460     };
461     bar(x);
462 }
463 ```
464
465 For a generic item, you can copy over the parameters:
466
467 ```
468 fn foo<T>(x: T) {
469     fn bar<T>(y: T) {
470         // ..
471     }
472     bar(x);
473 }
474 ```
475
476 ```
477 fn foo<T>(x: T) {
478     type MaybeT<T> = Option<T>;
479 }
480 ```
481
482 Be sure to copy over any bounds as well:
483
484 ```
485 fn foo<T: Copy>(x: T) {
486     fn bar<T: Copy>(y: T) {
487         // ..
488     }
489     bar(x);
490 }
491 ```
492
493 ```
494 fn foo<T: Copy>(x: T) {
495     struct Foo<T: Copy> {
496         x: T,
497     }
498 }
499 ```
500
501 This may require additional type hints in the function body.
502
503 In case the item is a function inside an `impl`, defining a private helper
504 function might be easier:
505
506 ```
507 # struct Foo<T>(T);
508 impl<T> Foo<T> {
509     pub fn foo(&self, x: T) {
510         self.bar(x);
511     }
512
513     fn bar(&self, y: T) {
514         // ..
515     }
516 }
517 ```
518
519 For default impls in traits, the private helper solution won't work, however
520 closures or copying the parameters should still work.
521 "##,
522
523 E0403: r##"
524 Some type parameters have the same name.
525
526 Erroneous code example:
527
528 ```compile_fail,E0403
529 fn foo<T, T>(s: T, u: T) {} // error: the name `T` is already used for a type
530                             //        parameter in this type parameter list
531 ```
532
533 Please verify that none of the type parameters are misspelled, and rename any
534 clashing parameters. Example:
535
536 ```
537 fn foo<T, Y>(s: T, u: Y) {} // ok!
538 ```
539 "##,
540
541 E0404: r##"
542 You tried to use something which is not a trait in a trait position, such as
543 a bound or `impl`.
544
545 Erroneous code example:
546
547 ```compile_fail,E0404
548 struct Foo;
549 struct Bar;
550
551 impl Foo for Bar {} // error: `Foo` is not a trait
552 ```
553
554 Another erroneous code example:
555
556 ```compile_fail,E0404
557 struct Foo;
558
559 fn bar<T: Foo>(t: T) {} // error: `Foo` is not a trait
560 ```
561
562 Please verify that you didn't misspell the trait's name or otherwise use the
563 wrong identifier. Example:
564
565 ```
566 trait Foo {
567     // some functions
568 }
569 struct Bar;
570
571 impl Foo for Bar { // ok!
572     // functions implementation
573 }
574 ```
575
576 or
577
578 ```
579 trait Foo {
580     // some functions
581 }
582
583 fn bar<T: Foo>(t: T) {} // ok!
584 ```
585
586 "##,
587
588 E0405: r##"
589 The code refers to a trait that is not in scope.
590
591 Erroneous code example:
592
593 ```compile_fail,E0405
594 struct Foo;
595
596 impl SomeTrait for Foo {} // error: trait `SomeTrait` is not in scope
597 ```
598
599 Please verify that the name of the trait wasn't misspelled and ensure that it
600 was imported. Example:
601
602 ```
603 # #[cfg(for_demonstration_only)]
604 // solution 1:
605 use some_file::SomeTrait;
606
607 // solution 2:
608 trait SomeTrait {
609     // some functions
610 }
611
612 struct Foo;
613
614 impl SomeTrait for Foo { // ok!
615     // implements functions
616 }
617 ```
618 "##,
619
620 E0407: r##"
621 A definition of a method not in the implemented trait was given in a trait
622 implementation.
623
624 Erroneous code example:
625
626 ```compile_fail,E0407
627 trait Foo {
628     fn a();
629 }
630
631 struct Bar;
632
633 impl Foo for Bar {
634     fn a() {}
635     fn b() {} // error: method `b` is not a member of trait `Foo`
636 }
637 ```
638
639 Please verify you didn't misspell the method name and you used the correct
640 trait. First example:
641
642 ```
643 trait Foo {
644     fn a();
645     fn b();
646 }
647
648 struct Bar;
649
650 impl Foo for Bar {
651     fn a() {}
652     fn b() {} // ok!
653 }
654 ```
655
656 Second example:
657
658 ```
659 trait Foo {
660     fn a();
661 }
662
663 struct Bar;
664
665 impl Foo for Bar {
666     fn a() {}
667 }
668
669 impl Bar {
670     fn b() {}
671 }
672 ```
673 "##,
674
675 E0408: r##"
676 An "or" pattern was used where the variable bindings are not consistently bound
677 across patterns.
678
679 Erroneous code example:
680
681 ```compile_fail,E0408
682 match x {
683     Some(y) | None => { /* use y */ } // error: variable `y` from pattern #1 is
684                                       //        not bound in pattern #2
685     _ => ()
686 }
687 ```
688
689 Here, `y` is bound to the contents of the `Some` and can be used within the
690 block corresponding to the match arm. However, in case `x` is `None`, we have
691 not specified what `y` is, and the block will use a nonexistent variable.
692
693 To fix this error, either split into multiple match arms:
694
695 ```
696 let x = Some(1);
697 match x {
698     Some(y) => { /* use y */ }
699     None => { /* ... */ }
700 }
701 ```
702
703 or, bind the variable to a field of the same type in all sub-patterns of the
704 or pattern:
705
706 ```
707 let x = (0, 2);
708 match x {
709     (0, y) | (y, 0) => { /* use y */}
710     _ => {}
711 }
712 ```
713
714 In this example, if `x` matches the pattern `(0, _)`, the second field is set
715 to `y`. If it matches `(_, 0)`, the first field is set to `y`; so in all
716 cases `y` is set to some value.
717 "##,
718
719 E0409: r##"
720 An "or" pattern was used where the variable bindings are not consistently bound
721 across patterns.
722
723 Erroneous code example:
724
725 ```compile_fail,E0409
726 let x = (0, 2);
727 match x {
728     (0, ref y) | (y, 0) => { /* use y */} // error: variable `y` is bound with
729                                           //        different mode in pattern #2
730                                           //        than in pattern #1
731     _ => ()
732 }
733 ```
734
735 Here, `y` is bound by-value in one case and by-reference in the other.
736
737 To fix this error, just use the same mode in both cases.
738 Generally using `ref` or `ref mut` where not already used will fix this:
739
740 ```
741 let x = (0, 2);
742 match x {
743     (0, ref y) | (ref y, 0) => { /* use y */}
744     _ => ()
745 }
746 ```
747
748 Alternatively, split the pattern:
749
750 ```
751 let x = (0, 2);
752 match x {
753     (y, 0) => { /* use y */ }
754     (0, ref y) => { /* use y */}
755     _ => ()
756 }
757 ```
758 "##,
759
760 E0411: r##"
761 The `Self` keyword was used outside an impl, trait, or type definition.
762
763 Erroneous code example:
764
765 ```compile_fail,E0411
766 <Self>::foo; // error: use of `Self` outside of an impl, trait, or type
767              // definition
768 ```
769
770 The `Self` keyword represents the current type, which explains why it can only
771 be used inside an impl, trait, or type definition. It gives access to the
772 associated items of a type:
773
774 ```
775 trait Foo {
776     type Bar;
777 }
778
779 trait Baz : Foo {
780     fn bar() -> Self::Bar; // like this
781 }
782 ```
783
784 However, be careful when two types have a common associated type:
785
786 ```compile_fail
787 trait Foo {
788     type Bar;
789 }
790
791 trait Foo2 {
792     type Bar;
793 }
794
795 trait Baz : Foo + Foo2 {
796     fn bar() -> Self::Bar;
797     // error: ambiguous associated type `Bar` in bounds of `Self`
798 }
799 ```
800
801 This problem can be solved by specifying from which trait we want to use the
802 `Bar` type:
803
804 ```
805 trait Foo {
806     type Bar;
807 }
808
809 trait Foo2 {
810     type Bar;
811 }
812
813 trait Baz : Foo + Foo2 {
814     fn bar() -> <Self as Foo>::Bar; // ok!
815 }
816 ```
817 "##,
818
819 E0412: r##"
820 The type name used is not in scope.
821
822 Erroneous code examples:
823
824 ```compile_fail,E0412
825 impl Something {} // error: type name `Something` is not in scope
826
827 // or:
828
829 trait Foo {
830     fn bar(N); // error: type name `N` is not in scope
831 }
832
833 // or:
834
835 fn foo(x: T) {} // type name `T` is not in scope
836 ```
837
838 To fix this error, please verify you didn't misspell the type name, you did
839 declare it or imported it into the scope. Examples:
840
841 ```
842 struct Something;
843
844 impl Something {} // ok!
845
846 // or:
847
848 trait Foo {
849     type N;
850
851     fn bar(_: Self::N); // ok!
852 }
853
854 // or:
855
856 fn foo<T>(x: T) {} // ok!
857 ```
858
859 Another case that causes this error is when a type is imported into a parent
860 module. To fix this, you can follow the suggestion and use File directly or
861 `use super::File;` which will import the types from the parent namespace. An
862 example that causes this error is below:
863
864 ```compile_fail,E0412
865 use std::fs::File;
866
867 mod foo {
868     fn some_function(f: File) {}
869 }
870 ```
871
872 ```
873 use std::fs::File;
874
875 mod foo {
876     // either
877     use super::File;
878     // or
879     // use std::fs::File;
880     fn foo(f: File) {}
881 }
882 # fn main() {} // don't insert it for us; that'll break imports
883 ```
884 "##,
885
886 E0415: r##"
887 More than one function parameter have the same name.
888
889 Erroneous code example:
890
891 ```compile_fail,E0415
892 fn foo(f: i32, f: i32) {} // error: identifier `f` is bound more than
893                           //        once in this parameter list
894 ```
895
896 Please verify you didn't misspell parameters' name. Example:
897
898 ```
899 fn foo(f: i32, g: i32) {} // ok!
900 ```
901 "##,
902
903 E0416: r##"
904 An identifier is bound more than once in a pattern.
905
906 Erroneous code example:
907
908 ```compile_fail,E0416
909 match (1, 2) {
910     (x, x) => {} // error: identifier `x` is bound more than once in the
911                  //        same pattern
912 }
913 ```
914
915 Please verify you didn't misspell identifiers' name. Example:
916
917 ```
918 match (1, 2) {
919     (x, y) => {} // ok!
920 }
921 ```
922
923 Or maybe did you mean to unify? Consider using a guard:
924
925 ```
926 # let (A, B, C) = (1, 2, 3);
927 match (A, B, C) {
928     (x, x2, see) if x == x2 => { /* A and B are equal, do one thing */ }
929     (y, z, see) => { /* A and B unequal; do another thing */ }
930 }
931 ```
932 "##,
933
934 E0422: r##"
935 You are trying to use an identifier that is either undefined or not a struct.
936 Erroneous code example:
937
938 ```compile_fail,E0422
939 fn main () {
940     let x = Foo { x: 1, y: 2 };
941 }
942 ```
943
944 In this case, `Foo` is undefined, so it inherently isn't anything, and
945 definitely not a struct.
946
947 ```compile_fail
948 fn main () {
949     let foo = 1;
950     let x = foo { x: 1, y: 2 };
951 }
952 ```
953
954 In this case, `foo` is defined, but is not a struct, so Rust can't use it as
955 one.
956 "##,
957
958 E0423: r##"
959 An identifier was used like a function name or a value was expected and the
960 identifier exists but it belongs to a different namespace.
961
962 For (an erroneous) example, here a `struct` variant name were used as a
963 function:
964
965 ```compile_fail,E0423
966 struct Foo { a: bool };
967
968 let f = Foo();
969 // error: expected function, found `Foo`
970 // `Foo` is a struct name, but this expression uses it like a function name
971 ```
972
973 Please verify you didn't misspell the name of what you actually wanted to use
974 here. Example:
975
976 ```
977 fn Foo() -> u32 { 0 }
978
979 let f = Foo(); // ok!
980 ```
981
982 It is common to forget the trailing `!` on macro invocations, which would also
983 yield this error:
984
985 ```compile_fail,E0423
986 println("");
987 // error: expected function, found macro `println`
988 // did you mean `println!(...)`? (notice the trailing `!`)
989 ```
990
991 Another case where this error is emitted is when a value is expected, but
992 something else is found:
993
994 ```compile_fail,E0423
995 pub mod a {
996     pub const I: i32 = 1;
997 }
998
999 fn h1() -> i32 {
1000     a.I
1001     //~^ ERROR expected value, found module `a`
1002     // did you mean `a::I`?
1003 }
1004 ```
1005 "##,
1006
1007 E0424: r##"
1008 The `self` keyword was used in a static method.
1009
1010 Erroneous code example:
1011
1012 ```compile_fail,E0424
1013 struct Foo;
1014
1015 impl Foo {
1016     fn bar(self) {}
1017
1018     fn foo() {
1019         self.bar(); // error: `self` is not available in a static method.
1020     }
1021 }
1022 ```
1023
1024 Please check if the method's argument list should have contained `self`,
1025 `&self`, or `&mut self` (in case you didn't want to create a static
1026 method), and add it if so. Example:
1027
1028 ```
1029 struct Foo;
1030
1031 impl Foo {
1032     fn bar(self) {}
1033
1034     fn foo(self) {
1035         self.bar(); // ok!
1036     }
1037 }
1038 ```
1039 "##,
1040
1041 E0425: r##"
1042 An unresolved name was used.
1043
1044 Erroneous code examples:
1045
1046 ```compile_fail,E0425
1047 something_that_doesnt_exist::foo;
1048 // error: unresolved name `something_that_doesnt_exist::foo`
1049
1050 // or:
1051
1052 trait Foo {
1053     fn bar() {
1054         Self; // error: unresolved name `Self`
1055     }
1056 }
1057
1058 // or:
1059
1060 let x = unknown_variable;  // error: unresolved name `unknown_variable`
1061 ```
1062
1063 Please verify that the name wasn't misspelled and ensure that the
1064 identifier being referred to is valid for the given situation. Example:
1065
1066 ```
1067 enum something_that_does_exist {
1068     Foo,
1069 }
1070 ```
1071
1072 Or:
1073
1074 ```
1075 mod something_that_does_exist {
1076     pub static foo : i32 = 0i32;
1077 }
1078
1079 something_that_does_exist::foo; // ok!
1080 ```
1081
1082 Or:
1083
1084 ```
1085 let unknown_variable = 12u32;
1086 let x = unknown_variable; // ok!
1087 ```
1088
1089 If the item is not defined in the current module, it must be imported using a
1090 `use` statement, like so:
1091
1092 ```
1093 # mod foo { pub fn bar() {} }
1094 # fn main() {
1095 use foo::bar;
1096 bar();
1097 # }
1098 ```
1099
1100 If the item you are importing is not defined in some super-module of the
1101 current module, then it must also be declared as public (e.g., `pub fn`).
1102 "##,
1103
1104 E0426: r##"
1105 An undeclared label was used.
1106
1107 Erroneous code example:
1108
1109 ```compile_fail,E0426
1110 loop {
1111     break 'a; // error: use of undeclared label `'a`
1112 }
1113 ```
1114
1115 Please verify you spelt or declare the label correctly. Example:
1116
1117 ```
1118 'a: loop {
1119     break 'a; // ok!
1120 }
1121 ```
1122 "##,
1123
1124 E0428: r##"
1125 A type or module has been defined more than once.
1126
1127 Erroneous code example:
1128
1129 ```compile_fail,E0428
1130 struct Bar;
1131 struct Bar; // error: duplicate definition of value `Bar`
1132 ```
1133
1134 Please verify you didn't misspell the type/module's name or remove/rename the
1135 duplicated one. Example:
1136
1137 ```
1138 struct Bar;
1139 struct Bar2; // ok!
1140 ```
1141 "##,
1142
1143 E0429: r##"
1144 The `self` keyword cannot appear alone as the last segment in a `use`
1145 declaration.
1146
1147 Erroneous code example:
1148
1149 ```compile_fail,E0429
1150 use std::fmt::self; // error: `self` imports are only allowed within a { } list
1151 ```
1152
1153 To use a namespace itself in addition to some of its members, `self` may appear
1154 as part of a brace-enclosed list of imports:
1155
1156 ```
1157 use std::fmt::{self, Debug};
1158 ```
1159
1160 If you only want to import the namespace, do so directly:
1161
1162 ```
1163 use std::fmt;
1164 ```
1165 "##,
1166
1167 E0430: r##"
1168 The `self` import appears more than once in the list.
1169
1170 Erroneous code example:
1171
1172 ```compile_fail,E0430
1173 use something::{self, self}; // error: `self` import can only appear once in
1174                              //        the list
1175 ```
1176
1177 Please verify you didn't misspell the import name or remove the duplicated
1178 `self` import. Example:
1179
1180 ```
1181 # mod something {}
1182 # fn main() {
1183 use something::{self}; // ok!
1184 # }
1185 ```
1186 "##,
1187
1188 E0431: r##"
1189 An invalid `self` import was made.
1190
1191 Erroneous code example:
1192
1193 ```compile_fail,E0431
1194 use {self}; // error: `self` import can only appear in an import list with a
1195             //        non-empty prefix
1196 ```
1197
1198 You cannot import the current module into itself, please remove this import
1199 or verify you didn't misspell it.
1200 "##,
1201
1202 E0432: r##"
1203 An import was unresolved.
1204
1205 Erroneous code example:
1206
1207 ```compile_fail,E0432
1208 use something::Foo; // error: unresolved import `something::Foo`.
1209 ```
1210
1211 Paths in `use` statements are relative to the crate root. To import items
1212 relative to the current and parent modules, use the `self::` and `super::`
1213 prefixes, respectively. Also verify that you didn't misspell the import
1214 name and that the import exists in the module from where you tried to
1215 import it. Example:
1216
1217 ```
1218 use self::something::Foo; // ok!
1219
1220 mod something {
1221     pub struct Foo;
1222 }
1223 # fn main() {}
1224 ```
1225
1226 Or, if you tried to use a module from an external crate, you may have missed
1227 the `extern crate` declaration (which is usually placed in the crate root):
1228
1229 ```
1230 extern crate core; // Required to use the `core` crate
1231
1232 use core::any;
1233 # fn main() {}
1234 ```
1235 "##,
1236
1237 E0433: r##"
1238 An undeclared type or module was used.
1239
1240 Erroneous code example:
1241
1242 ```compile_fail,E0433
1243 let map = HashMap::new();
1244 // error: failed to resolve: use of undeclared type or module `HashMap`
1245 ```
1246
1247 Please verify you didn't misspell the type/module's name or that you didn't
1248 forget to import it:
1249
1250
1251 ```
1252 use std::collections::HashMap; // HashMap has been imported.
1253 let map: HashMap<u32, u32> = HashMap::new(); // So it can be used!
1254 ```
1255 "##,
1256
1257 E0434: r##"
1258 This error indicates that a variable usage inside an inner function is invalid
1259 because the variable comes from a dynamic environment. Inner functions do not
1260 have access to their containing environment.
1261
1262 Erroneous code example:
1263
1264 ```compile_fail,E0434
1265 fn foo() {
1266     let y = 5;
1267     fn bar() -> u32 {
1268         y // error: can't capture dynamic environment in a fn item; use the
1269           //        || { ... } closure form instead.
1270     }
1271 }
1272 ```
1273
1274 Functions do not capture local variables. To fix this error, you can replace the
1275 function with a closure:
1276
1277 ```
1278 fn foo() {
1279     let y = 5;
1280     let bar = || {
1281         y
1282     };
1283 }
1284 ```
1285
1286 or replace the captured variable with a constant or a static item:
1287
1288 ```
1289 fn foo() {
1290     static mut X: u32 = 4;
1291     const Y: u32 = 5;
1292     fn bar() -> u32 {
1293         unsafe {
1294             X = 3;
1295         }
1296         Y
1297     }
1298 }
1299 ```
1300 "##,
1301
1302 E0435: r##"
1303 A non-constant value was used in a constant expression.
1304
1305 Erroneous code example:
1306
1307 ```compile_fail,E0435
1308 let foo = 42;
1309 let a: [u8; foo]; // error: attempt to use a non-constant value in a constant
1310 ```
1311
1312 To fix this error, please replace the value with a constant. Example:
1313
1314 ```
1315 let a: [u8; 42]; // ok!
1316 ```
1317
1318 Or:
1319
1320 ```
1321 const FOO: usize = 42;
1322 let a: [u8; FOO]; // ok!
1323 ```
1324 "##,
1325
1326 E0437: r##"
1327 Trait implementations can only implement associated types that are members of
1328 the trait in question. This error indicates that you attempted to implement
1329 an associated type whose name does not match the name of any associated type
1330 in the trait.
1331
1332 Erroneous code example:
1333
1334 ```compile_fail,E0437
1335 trait Foo {}
1336
1337 impl Foo for i32 {
1338     type Bar = bool;
1339 }
1340 ```
1341
1342 The solution to this problem is to remove the extraneous associated type:
1343
1344 ```
1345 trait Foo {}
1346
1347 impl Foo for i32 {}
1348 ```
1349 "##,
1350
1351 E0438: r##"
1352 Trait implementations can only implement associated constants that are
1353 members of the trait in question. This error indicates that you
1354 attempted to implement an associated constant whose name does not
1355 match the name of any associated constant in the trait.
1356
1357 Erroneous code example:
1358
1359 ```compile_fail,E0438
1360 trait Foo {}
1361
1362 impl Foo for i32 {
1363     const BAR: bool = true;
1364 }
1365 ```
1366
1367 The solution to this problem is to remove the extraneous associated constant:
1368
1369 ```
1370 trait Foo {}
1371
1372 impl Foo for i32 {}
1373 ```
1374 "##,
1375
1376 E0466: r##"
1377 Macro import declarations were malformed.
1378
1379 Erroneous code examples:
1380
1381 ```compile_fail,E0466
1382 #[macro_use(a_macro(another_macro))] // error: invalid import declaration
1383 extern crate core as some_crate;
1384
1385 #[macro_use(i_want = "some_macros")] // error: invalid import declaration
1386 extern crate core as another_crate;
1387 ```
1388
1389 This is a syntax error at the level of attribute declarations. The proper
1390 syntax for macro imports is the following:
1391
1392 ```ignore (cannot-doctest-multicrate-project)
1393 // In some_crate:
1394 #[macro_export]
1395 macro_rules! get_tacos {
1396     ...
1397 }
1398
1399 #[macro_export]
1400 macro_rules! get_pimientos {
1401     ...
1402 }
1403
1404 // In your crate:
1405 #[macro_use(get_tacos, get_pimientos)] // It imports `get_tacos` and
1406 extern crate some_crate;               // `get_pimientos` macros from some_crate
1407 ```
1408
1409 If you would like to import all exported macros, write `macro_use` with no
1410 arguments.
1411 "##,
1412
1413 E0468: r##"
1414 A non-root module attempts to import macros from another crate.
1415
1416 Example of erroneous code:
1417
1418 ```compile_fail,E0468
1419 mod foo {
1420     #[macro_use(debug_assert)]  // error: must be at crate root to import
1421     extern crate core;          //        macros from another crate
1422     fn run_macro() { debug_assert!(true); }
1423 }
1424 ```
1425
1426 Only `extern crate` imports at the crate root level are allowed to import
1427 macros.
1428
1429 Either move the macro import to crate root or do without the foreign macros.
1430 This will work:
1431
1432 ```
1433 #[macro_use(debug_assert)]
1434 extern crate core;
1435
1436 mod foo {
1437     fn run_macro() { debug_assert!(true); }
1438 }
1439 # fn main() {}
1440 ```
1441 "##,
1442
1443 E0469: r##"
1444 A macro listed for import was not found.
1445
1446 Erroneous code example:
1447
1448 ```compile_fail,E0469
1449 #[macro_use(drink, be_merry)] // error: imported macro not found
1450 extern crate alloc;
1451
1452 fn main() {
1453     // ...
1454 }
1455 ```
1456
1457 Either the listed macro is not contained in the imported crate, or it is not
1458 exported from the given crate.
1459
1460 This could be caused by a typo. Did you misspell the macro's name?
1461
1462 Double-check the names of the macros listed for import, and that the crate
1463 in question exports them.
1464
1465 A working version would be:
1466
1467 ```ignore (cannot-doctest-multicrate-project)
1468 // In some_crate crate:
1469 #[macro_export]
1470 macro_rules! eat {
1471     ...
1472 }
1473
1474 #[macro_export]
1475 macro_rules! drink {
1476     ...
1477 }
1478
1479 // In your crate:
1480 #[macro_use(eat, drink)]
1481 extern crate some_crate; //ok!
1482 ```
1483 "##,
1484
1485 E0530: r##"
1486 A binding shadowed something it shouldn't.
1487
1488 Erroneous code example:
1489
1490 ```compile_fail,E0530
1491 static TEST: i32 = 0;
1492
1493 let r: (i32, i32) = (0, 0);
1494 match r {
1495     TEST => {} // error: match bindings cannot shadow statics
1496 }
1497 ```
1498
1499 To fix this error, just change the binding's name in order to avoid shadowing
1500 one of the following:
1501
1502 * struct name
1503 * struct/enum variant
1504 * static
1505 * const
1506 * associated const
1507
1508 Fixed example:
1509
1510 ```
1511 static TEST: i32 = 0;
1512
1513 let r: (i32, i32) = (0, 0);
1514 match r {
1515     something => {} // ok!
1516 }
1517 ```
1518 "##,
1519
1520 E0532: r##"
1521 Pattern arm did not match expected kind.
1522
1523 Erroneous code example:
1524
1525 ```compile_fail,E0532
1526 enum State {
1527     Succeeded,
1528     Failed(String),
1529 }
1530
1531 fn print_on_failure(state: &State) {
1532     match *state {
1533         // error: expected unit struct/variant or constant, found tuple
1534         //        variant `State::Failed`
1535         State::Failed => println!("Failed"),
1536         _ => ()
1537     }
1538 }
1539 ```
1540
1541 To fix this error, ensure the match arm kind is the same as the expression
1542 matched.
1543
1544 Fixed example:
1545
1546 ```
1547 enum State {
1548     Succeeded,
1549     Failed(String),
1550 }
1551
1552 fn print_on_failure(state: &State) {
1553     match *state {
1554         State::Failed(ref msg) => println!("Failed with {}", msg),
1555         _ => ()
1556     }
1557 }
1558 ```
1559 "##,
1560
1561 E0603: r##"
1562 A private item was used outside its scope.
1563
1564 Erroneous code example:
1565
1566 ```compile_fail,E0603
1567 mod SomeModule {
1568     const PRIVATE: u32 = 0x_a_bad_1dea_u32; // This const is private, so we
1569                                             // can't use it outside of the
1570                                             // `SomeModule` module.
1571 }
1572
1573 println!("const value: {}", SomeModule::PRIVATE); // error: constant `PRIVATE`
1574                                                   //        is private
1575 ```
1576
1577 In order to fix this error, you need to make the item public by using the `pub`
1578 keyword. Example:
1579
1580 ```
1581 mod SomeModule {
1582     pub const PRIVATE: u32 = 0x_a_bad_1dea_u32; // We set it public by using the
1583                                                 // `pub` keyword.
1584 }
1585
1586 println!("const value: {}", SomeModule::PRIVATE); // ok!
1587 ```
1588 "##,
1589
1590 E0659: r##"
1591 An item usage is ambiguous.
1592
1593 Erroneous code example:
1594
1595 ```compile_fail,E0659
1596 pub mod moon {
1597     pub fn foo() {}
1598 }
1599
1600 pub mod earth {
1601     pub fn foo() {}
1602 }
1603
1604 mod collider {
1605     pub use moon::*;
1606     pub use earth::*;
1607 }
1608
1609 fn main() {
1610     collider::foo(); // ERROR: `foo` is ambiguous
1611 }
1612 ```
1613
1614 This error generally appears when two items with the same name are imported into
1615 a module. Here, the `foo` functions are imported and reexported from the
1616 `collider` module and therefore, when we're using `collider::foo()`, both
1617 functions collide.
1618
1619 To solve this error, the best solution is generally to keep the path before the
1620 item when using it. Example:
1621
1622 ```
1623 pub mod moon {
1624     pub fn foo() {}
1625 }
1626
1627 pub mod earth {
1628     pub fn foo() {}
1629 }
1630
1631 mod collider {
1632     pub use moon;
1633     pub use earth;
1634 }
1635
1636 fn main() {
1637     collider::moon::foo(); // ok!
1638     collider::earth::foo(); // ok!
1639 }
1640 ```
1641 "##,
1642
1643 E0671: r##"
1644 Const parameters cannot depend on type parameters.
1645 The following is therefore invalid:
1646 ```compile_fail,E0671
1647 #![feature(const_generics)]
1648
1649 fn const_id<T, const N: T>() -> T { // error: const parameter
1650                                     // depends on type parameter
1651     N
1652 }
1653 ```
1654 "##,
1655
1656 }
1657
1658 register_diagnostics! {
1659 //  E0153, unused error code
1660 //  E0157, unused error code
1661 //  E0257,
1662 //  E0258,
1663 //  E0402, // cannot use an outer type parameter in this context
1664 //  E0406, merged into 420
1665 //  E0410, merged into 408
1666 //  E0413, merged into 530
1667 //  E0414, merged into 530
1668 //  E0417, merged into 532
1669 //  E0418, merged into 532
1670 //  E0419, merged into 531
1671 //  E0420, merged into 532
1672 //  E0421, merged into 531
1673     E0531, // unresolved pattern path kind `name`
1674 //  E0427, merged into 530
1675 //  E0467, removed
1676 //  E0470, removed
1677     E0573,
1678     E0574,
1679     E0575,
1680     E0576,
1681     E0577,
1682     E0578,
1683 }