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