]> git.lizzy.rs Git - rust.git/blob - src/librustc_resolve/diagnostics.rs
34f3ff276ccd97f9137d2ff9428f9d54f5141e08
[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
330 There are two possible solutions:
331
332 Solution #1: Rename the item.
333
334 ```
335 extern crate core;
336
337 struct xyz;
338 ```
339
340 Solution #2: Import the crate with a different name.
341
342 ```
343 extern crate core as xyz;
344
345 struct abc;
346 ```
347
348 See the Declaration Statements section of the reference for more information
349 about what constitutes an Item declaration and what does not:
350
351 https://doc.rust-lang.org/reference.html#statements
352 "##,
353
354 E0364: r##"
355 Private items cannot be publicly re-exported. This error indicates that you
356 attempted to `pub use` a type or value that was not itself public.
357
358 Erroneous code example:
359
360 ```compile_fail
361 mod foo {
362     const X: u32 = 1;
363 }
364
365 pub use foo::X;
366
367 fn main() {}
368 ```
369
370 The solution to this problem is to ensure that the items that you are
371 re-exporting are themselves marked with `pub`:
372
373 ```
374 mod foo {
375     pub const X: u32 = 1;
376 }
377
378 pub use foo::X;
379
380 fn main() {}
381 ```
382
383 See the 'Use Declarations' section of the reference for more information on
384 this topic:
385
386 https://doc.rust-lang.org/reference.html#use-declarations
387 "##,
388
389 E0365: r##"
390 Private modules cannot be publicly re-exported. This error indicates that you
391 attempted to `pub use` a module that was not itself public.
392
393 Erroneous code example:
394
395 ```compile_fail,E0365
396 mod foo {
397     pub const X: u32 = 1;
398 }
399
400 pub use foo as foo2;
401
402 fn main() {}
403 ```
404
405 The solution to this problem is to ensure that the module that you are
406 re-exporting is itself marked with `pub`:
407
408 ```
409 pub mod foo {
410     pub const X: u32 = 1;
411 }
412
413 pub use foo as foo2;
414
415 fn main() {}
416 ```
417
418 See the 'Use Declarations' section of the reference for more information
419 on this topic:
420
421 https://doc.rust-lang.org/reference.html#use-declarations
422 "##,
423
424 E0401: r##"
425 Inner items do not inherit type parameters from the functions they are embedded
426 in.
427
428 Erroneous code example:
429
430 ```compile_fail,E0401
431 fn foo<T>(x: T) {
432     fn bar(y: T) { // T is defined in the "outer" function
433         // ..
434     }
435     bar(x);
436 }
437 ```
438
439 Nor will this:
440
441 ```compile_fail,E0401
442 fn foo<T>(x: T) {
443     type MaybeT = Option<T>;
444     // ...
445 }
446 ```
447
448 Or this:
449
450 ```compile_fail,E0401
451 fn foo<T>(x: T) {
452     struct Foo {
453         x: T,
454     }
455     // ...
456 }
457 ```
458
459 Items inside functions are basically just like top-level items, except
460 that they can only be used from the function they are in.
461
462 There are a couple of solutions for this.
463
464 If the item is a function, you may use a closure:
465
466 ```
467 fn foo<T>(x: T) {
468     let bar = |y: T| { // explicit type annotation may not be necessary
469         // ..
470     };
471     bar(x);
472 }
473 ```
474
475 For a generic item, you can copy over the parameters:
476
477 ```
478 fn foo<T>(x: T) {
479     fn bar<T>(y: T) {
480         // ..
481     }
482     bar(x);
483 }
484 ```
485
486 ```
487 fn foo<T>(x: T) {
488     type MaybeT<T> = Option<T>;
489 }
490 ```
491
492 Be sure to copy over any bounds as well:
493
494 ```
495 fn foo<T: Copy>(x: T) {
496     fn bar<T: Copy>(y: T) {
497         // ..
498     }
499     bar(x);
500 }
501 ```
502
503 ```
504 fn foo<T: Copy>(x: T) {
505     struct Foo<T: Copy> {
506         x: T,
507     }
508 }
509 ```
510
511 This may require additional type hints in the function body.
512
513 In case the item is a function inside an `impl`, defining a private helper
514 function might be easier:
515
516 ```
517 # struct Foo<T>(T);
518 impl<T> Foo<T> {
519     pub fn foo(&self, x: T) {
520         self.bar(x);
521     }
522
523     fn bar(&self, y: T) {
524         // ..
525     }
526 }
527 ```
528
529 For default impls in traits, the private helper solution won't work, however
530 closures or copying the parameters should still work.
531 "##,
532
533 E0403: r##"
534 Some type parameters have the same name.
535
536 Erroneous code example:
537
538 ```compile_fail,E0403
539 fn foo<T, T>(s: T, u: T) {} // error: the name `T` is already used for a type
540                             //        parameter in this type parameter list
541 ```
542
543 Please verify that none of the type parameterss are misspelled, and rename any
544 clashing parameters. Example:
545
546 ```
547 fn foo<T, Y>(s: T, u: Y) {} // ok!
548 ```
549 "##,
550
551 E0404: r##"
552 You tried to implement something which was not a trait on an object.
553
554 Erroneous code example:
555
556 ```compile_fail,E0404
557 struct Foo;
558 struct Bar;
559
560 impl Foo for Bar {} // error: `Foo` is not a trait
561 ```
562
563 Please verify that you didn't misspell the trait's name or otherwise use the
564 wrong identifier. Example:
565
566 ```
567 trait Foo {
568     // some functions
569 }
570 struct Bar;
571
572 impl Foo for Bar { // ok!
573     // functions implementation
574 }
575 ```
576 "##,
577
578 E0405: r##"
579 The code refers to a trait that is not in scope.
580
581 Erroneous code example:
582
583 ```compile_fail,E0405
584 struct Foo;
585
586 impl SomeTrait for Foo {} // error: trait `SomeTrait` is not in scope
587 ```
588
589 Please verify that the name of the trait wasn't misspelled and ensure that it
590 was imported. Example:
591
592 ```
593 # #[cfg(for_demonstration_only)]
594 // solution 1:
595 use some_file::SomeTrait;
596
597 // solution 2:
598 trait SomeTrait {
599     // some functions
600 }
601
602 struct Foo;
603
604 impl SomeTrait for Foo { // ok!
605     // implements functions
606 }
607 ```
608 "##,
609
610 E0407: r##"
611 A definition of a method not in the implemented trait was given in a trait
612 implementation.
613
614 Erroneous code example:
615
616 ```compile_fail,E0407
617 trait Foo {
618     fn a();
619 }
620
621 struct Bar;
622
623 impl Foo for Bar {
624     fn a() {}
625     fn b() {} // error: method `b` is not a member of trait `Foo`
626 }
627 ```
628
629 Please verify you didn't misspell the method name and you used the correct
630 trait. First example:
631
632 ```
633 trait Foo {
634     fn a();
635     fn b();
636 }
637
638 struct Bar;
639
640 impl Foo for Bar {
641     fn a() {}
642     fn b() {} // ok!
643 }
644 ```
645
646 Second example:
647
648 ```
649 trait Foo {
650     fn a();
651 }
652
653 struct Bar;
654
655 impl Foo for Bar {
656     fn a() {}
657 }
658
659 impl Bar {
660     fn b() {}
661 }
662 ```
663 "##,
664
665 E0408: r##"
666 An "or" pattern was used where the variable bindings are not consistently bound
667 across patterns.
668
669 Erroneous code example:
670
671 ```compile_fail,E0408
672 match x {
673     Some(y) | None => { /* use y */ } // error: variable `y` from pattern #1 is
674                                       //        not bound in pattern #2
675     _ => ()
676 }
677 ```
678
679 Here, `y` is bound to the contents of the `Some` and can be used within the
680 block corresponding to the match arm. However, in case `x` is `None`, we have
681 not specified what `y` is, and the block will use a nonexistent variable.
682
683 To fix this error, either split into multiple match arms:
684
685 ```
686 let x = Some(1);
687 match x {
688     Some(y) => { /* use y */ }
689     None => { /* ... */ }
690 }
691 ```
692
693 or, bind the variable to a field of the same type in all sub-patterns of the
694 or pattern:
695
696 ```
697 let x = (0, 2);
698 match x {
699     (0, y) | (y, 0) => { /* use y */}
700     _ => {}
701 }
702 ```
703
704 In this example, if `x` matches the pattern `(0, _)`, the second field is set
705 to `y`. If it matches `(_, 0)`, the first field is set to `y`; so in all
706 cases `y` is set to some value.
707 "##,
708
709 E0409: r##"
710 An "or" pattern was used where the variable bindings are not consistently bound
711 across patterns.
712
713 Erroneous code example:
714
715 ```compile_fail,E0409
716 let x = (0, 2);
717 match x {
718     (0, ref y) | (y, 0) => { /* use y */} // error: variable `y` is bound with
719                                           //        different mode in pattern #2
720                                           //        than in pattern #1
721     _ => ()
722 }
723 ```
724
725 Here, `y` is bound by-value in one case and by-reference in the other.
726
727 To fix this error, just use the same mode in both cases.
728 Generally using `ref` or `ref mut` where not already used will fix this:
729
730 ```
731 let x = (0, 2);
732 match x {
733     (0, ref y) | (ref y, 0) => { /* use y */}
734     _ => ()
735 }
736 ```
737
738 Alternatively, split the pattern:
739
740 ```
741 let x = (0, 2);
742 match x {
743     (y, 0) => { /* use y */ }
744     (0, ref y) => { /* use y */}
745     _ => ()
746 }
747 ```
748 "##,
749
750 E0411: r##"
751 The `Self` keyword was used outside an impl or a trait.
752
753 Erroneous code example:
754
755 ```compile_fail,E0411
756 <Self>::foo; // error: use of `Self` outside of an impl or trait
757 ```
758
759 The `Self` keyword represents the current type, which explains why it can only
760 be used inside an impl or a trait. It gives access to the associated items of a
761 type:
762
763 ```
764 trait Foo {
765     type Bar;
766 }
767
768 trait Baz : Foo {
769     fn bar() -> Self::Bar; // like this
770 }
771 ```
772
773 However, be careful when two types have a common associated type:
774
775 ```compile_fail
776 trait Foo {
777     type Bar;
778 }
779
780 trait Foo2 {
781     type Bar;
782 }
783
784 trait Baz : Foo + Foo2 {
785     fn bar() -> Self::Bar;
786     // error: ambiguous associated type `Bar` in bounds of `Self`
787 }
788 ```
789
790 This problem can be solved by specifying from which trait we want to use the
791 `Bar` type:
792
793 ```
794 trait Foo {
795     type Bar;
796 }
797
798 trait Foo2 {
799     type Bar;
800 }
801
802 trait Baz : Foo + Foo2 {
803     fn bar() -> <Self as Foo>::Bar; // ok!
804 }
805 ```
806 "##,
807
808 E0412: r##"
809 The type name used is not in scope.
810
811 Erroneous code examples:
812
813 ```compile_fail,E0412
814 impl Something {} // error: type name `Something` is not in scope
815
816 // or:
817
818 trait Foo {
819     fn bar(N); // error: type name `N` is not in scope
820 }
821
822 // or:
823
824 fn foo(x: T) {} // type name `T` is not in scope
825 ```
826
827 To fix this error, please verify you didn't misspell the type name, you did
828 declare it or imported it into the scope. Examples:
829
830 ```
831 struct Something;
832
833 impl Something {} // ok!
834
835 // or:
836
837 trait Foo {
838     type N;
839
840     fn bar(Self::N); // ok!
841 }
842
843 // or:
844
845 fn foo<T>(x: T) {} // ok!
846 ```
847
848 Another case that causes this error is when a type is imported into a parent
849 module. To fix this, you can follow the suggestion and use File directly or
850 `use super::File;` which will import the types from the parent namespace. An
851 example that causes this error is below:
852
853 ```compile_fail,E0412
854 use std::fs::File;
855
856 mod foo {
857     fn some_function(f: File) {}
858 }
859 ```
860
861 ```
862 use std::fs::File;
863
864 mod foo {
865     // either
866     use super::File;
867     // or
868     // use std::fs::File;
869     fn foo(f: File) {}
870 }
871 # fn main() {} // don't insert it for us; that'll break imports
872 ```
873 "##,
874
875 E0415: r##"
876 More than one function parameter have the same name.
877
878 Erroneous code example:
879
880 ```compile_fail,E0415
881 fn foo(f: i32, f: i32) {} // error: identifier `f` is bound more than
882                           //        once in this parameter list
883 ```
884
885 Please verify you didn't misspell parameters' name. Example:
886
887 ```
888 fn foo(f: i32, g: i32) {} // ok!
889 ```
890 "##,
891
892 E0416: r##"
893 An identifier is bound more than once in a pattern.
894
895 Erroneous code example:
896
897 ```compile_fail,E0416
898 match (1, 2) {
899     (x, x) => {} // error: identifier `x` is bound more than once in the
900                  //        same pattern
901 }
902 ```
903
904 Please verify you didn't misspell identifiers' name. Example:
905
906 ```
907 match (1, 2) {
908     (x, y) => {} // ok!
909 }
910 ```
911
912 Or maybe did you mean to unify? Consider using a guard:
913
914 ```
915 # let (A, B, C) = (1, 2, 3);
916 match (A, B, C) {
917     (x, x2, see) if x == x2 => { /* A and B are equal, do one thing */ }
918     (y, z, see) => { /* A and B unequal; do another thing */ }
919 }
920 ```
921 "##,
922
923 E0422: r##"
924 You are trying to use an identifier that is either undefined or not a struct.
925 Erroneous code example:
926
927 ```compile_fail,E0422
928 fn main () {
929     let x = Foo { x: 1, y: 2 };
930 }
931 ```
932
933 In this case, `Foo` is undefined, so it inherently isn't anything, and
934 definitely not a struct.
935
936 ```compile_fail
937 fn main () {
938     let foo = 1;
939     let x = foo { x: 1, y: 2 };
940 }
941 ```
942
943 In this case, `foo` is defined, but is not a struct, so Rust can't use it as
944 one.
945 "##,
946
947 E0423: r##"
948 A `struct` variant name was used like a function name.
949
950 Erroneous code example:
951
952 ```compile_fail,E0423
953 struct Foo { a: bool };
954
955 let f = Foo();
956 // error: `Foo` is a struct variant name, but this expression uses
957 //        it like a function name
958 ```
959
960 Please verify you didn't misspell the name of what you actually wanted to use
961 here. Example:
962
963 ```
964 fn Foo() -> u32 { 0 }
965
966 let f = Foo(); // ok!
967 ```
968 "##,
969
970 E0424: r##"
971 The `self` keyword was used in a static method.
972
973 Erroneous code example:
974
975 ```compile_fail,E0424
976 struct Foo;
977
978 impl Foo {
979     fn bar(self) {}
980
981     fn foo() {
982         self.bar(); // error: `self` is not available in a static method.
983     }
984 }
985 ```
986
987 Please check if the method's argument list should have contained `self`,
988 `&self`, or `&mut self` (in case you didn't want to create a static
989 method), and add it if so. Example:
990
991 ```
992 struct Foo;
993
994 impl Foo {
995     fn bar(self) {}
996
997     fn foo(self) {
998         self.bar(); // ok!
999     }
1000 }
1001 ```
1002 "##,
1003
1004 E0425: r##"
1005 An unresolved name was used.
1006
1007 Erroneous code examples:
1008
1009 ```compile_fail,E0425
1010 something_that_doesnt_exist::foo;
1011 // error: unresolved name `something_that_doesnt_exist::foo`
1012
1013 // or:
1014
1015 trait Foo {
1016     fn bar() {
1017         Self; // error: unresolved name `Self`
1018     }
1019 }
1020
1021 // or:
1022
1023 let x = unknown_variable;  // error: unresolved name `unknown_variable`
1024 ```
1025
1026 Please verify that the name wasn't misspelled and ensure that the
1027 identifier being referred to is valid for the given situation. Example:
1028
1029 ```
1030 enum something_that_does_exist {
1031     Foo,
1032 }
1033 ```
1034
1035 Or:
1036
1037 ```
1038 mod something_that_does_exist {
1039     pub static foo : i32 = 0i32;
1040 }
1041
1042 something_that_does_exist::foo; // ok!
1043 ```
1044
1045 Or:
1046
1047 ```
1048 let unknown_variable = 12u32;
1049 let x = unknown_variable; // ok!
1050 ```
1051
1052 If the item is not defined in the current module, it must be imported using a
1053 `use` statement, like so:
1054
1055 ```
1056 # mod foo { pub fn bar() {} }
1057 # fn main() {
1058 use foo::bar;
1059 bar();
1060 # }
1061 ```
1062
1063 If the item you are importing is not defined in some super-module of the
1064 current module, then it must also be declared as public (e.g., `pub fn`).
1065 "##,
1066
1067 E0426: r##"
1068 An undeclared label was used.
1069
1070 Erroneous code example:
1071
1072 ```compile_fail,E0426
1073 loop {
1074     break 'a; // error: use of undeclared label `'a`
1075 }
1076 ```
1077
1078 Please verify you spelt or declare the label correctly. Example:
1079
1080 ```
1081 'a: loop {
1082     break 'a; // ok!
1083 }
1084 ```
1085 "##,
1086
1087 E0428: r##"
1088 A type or module has been defined more than once.
1089
1090 Erroneous code example:
1091
1092 ```compile_fail,E0428
1093 struct Bar;
1094 struct Bar; // error: duplicate definition of value `Bar`
1095 ```
1096
1097 Please verify you didn't misspell the type/module's name or remove/rename the
1098 duplicated one. Example:
1099
1100 ```
1101 struct Bar;
1102 struct Bar2; // ok!
1103 ```
1104 "##,
1105
1106 E0429: r##"
1107 The `self` keyword cannot appear alone as the last segment in a `use`
1108 declaration.
1109
1110 Erroneous code example:
1111
1112 ```compile_fail,E0429
1113 use std::fmt::self; // error: `self` imports are only allowed within a { } list
1114 ```
1115
1116 To use a namespace itself in addition to some of its members, `self` may appear
1117 as part of a brace-enclosed list of imports:
1118
1119 ```
1120 use std::fmt::{self, Debug};
1121 ```
1122
1123 If you only want to import the namespace, do so directly:
1124
1125 ```
1126 use std::fmt;
1127 ```
1128 "##,
1129
1130 E0430: r##"
1131 The `self` import appears more than once in the list.
1132
1133 Erroneous code example:
1134
1135 ```compile_fail,E0430
1136 use something::{self, self}; // error: `self` import can only appear once in
1137                              //        the list
1138 ```
1139
1140 Please verify you didn't misspell the import name or remove the duplicated
1141 `self` import. Example:
1142
1143 ```
1144 # mod something {}
1145 # fn main() {
1146 use something::{self}; // ok!
1147 # }
1148 ```
1149 "##,
1150
1151 E0431: r##"
1152 An invalid `self` import was made.
1153
1154 Erroneous code example:
1155
1156 ```compile_fail,E0431
1157 use {self}; // error: `self` import can only appear in an import list with a
1158             //        non-empty prefix
1159 ```
1160
1161 You cannot import the current module into itself, please remove this import
1162 or verify you didn't misspell it.
1163 "##,
1164
1165 E0432: r##"
1166 An import was unresolved.
1167
1168 Erroneous code example:
1169
1170 ```compile_fail,E0432
1171 use something::Foo; // error: unresolved import `something::Foo`.
1172 ```
1173
1174 Paths in `use` statements are relative to the crate root. To import items
1175 relative to the current and parent modules, use the `self::` and `super::`
1176 prefixes, respectively. Also verify that you didn't misspell the import
1177 name and that the import exists in the module from where you tried to
1178 import it. Example:
1179
1180 ```
1181 use self::something::Foo; // ok!
1182
1183 mod something {
1184     pub struct Foo;
1185 }
1186 # fn main() {}
1187 ```
1188
1189 Or, if you tried to use a module from an external crate, you may have missed
1190 the `extern crate` declaration (which is usually placed in the crate root):
1191
1192 ```
1193 extern crate core; // Required to use the `core` crate
1194
1195 use core::any;
1196 # fn main() {}
1197 ```
1198 "##,
1199
1200 E0433: r##"
1201 An undeclared type or module was used.
1202
1203 Erroneous code example:
1204
1205 ```compile_fail,E0433
1206 let map = HashMap::new();
1207 // error: failed to resolve. Use of undeclared type or module `HashMap`
1208 ```
1209
1210 Please verify you didn't misspell the type/module's name or that you didn't
1211 forgot to import it:
1212
1213
1214 ```
1215 use std::collections::HashMap; // HashMap has been imported.
1216 let map: HashMap<u32, u32> = HashMap::new(); // So it can be used!
1217 ```
1218 "##,
1219
1220 E0434: r##"
1221 This error indicates that a variable usage inside an inner function is invalid
1222 because the variable comes from a dynamic environment. Inner functions do not
1223 have access to their containing environment.
1224
1225 Erroneous code example:
1226
1227 ```compile_fail,E0434
1228 fn foo() {
1229     let y = 5;
1230     fn bar() -> u32 {
1231         y // error: can't capture dynamic environment in a fn item; use the
1232           //        || { ... } closure form instead.
1233     }
1234 }
1235 ```
1236
1237 Functions do not capture local variables. To fix this error, you can replace the
1238 function with a closure:
1239
1240 ```
1241 fn foo() {
1242     let y = 5;
1243     let bar = || {
1244         y
1245     };
1246 }
1247 ```
1248
1249 or replace the captured variable with a constant or a static item:
1250
1251 ```
1252 fn foo() {
1253     static mut X: u32 = 4;
1254     const Y: u32 = 5;
1255     fn bar() -> u32 {
1256         unsafe {
1257             X = 3;
1258         }
1259         Y
1260     }
1261 }
1262 ```
1263 "##,
1264
1265 E0435: r##"
1266 A non-constant value was used in a constant expression.
1267
1268 Erroneous code example:
1269
1270 ```compile_fail,E0435
1271 let foo = 42;
1272 let a: [u8; foo]; // error: attempt to use a non-constant value in a constant
1273 ```
1274
1275 To fix this error, please replace the value with a constant. Example:
1276
1277 ```
1278 let a: [u8; 42]; // ok!
1279 ```
1280
1281 Or:
1282
1283 ```
1284 const FOO: usize = 42;
1285 let a: [u8; FOO]; // ok!
1286 ```
1287 "##,
1288
1289 E0437: r##"
1290 Trait implementations can only implement associated types that are members of
1291 the trait in question. This error indicates that you attempted to implement
1292 an associated type whose name does not match the name of any associated type
1293 in the trait.
1294
1295 Erroneous code example:
1296
1297 ```compile_fail,E0437
1298 trait Foo {}
1299
1300 impl Foo for i32 {
1301     type Bar = bool;
1302 }
1303 ```
1304
1305 The solution to this problem is to remove the extraneous associated type:
1306
1307 ```
1308 trait Foo {}
1309
1310 impl Foo for i32 {}
1311 ```
1312 "##,
1313
1314 E0438: r##"
1315 Trait implementations can only implement associated constants that are
1316 members of the trait in question. This error indicates that you
1317 attempted to implement an associated constant whose name does not
1318 match the name of any associated constant in the trait.
1319
1320 Erroneous code example:
1321
1322 ```compile_fail,E0438
1323 #![feature(associated_consts)]
1324
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 reexport 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 reexport 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 reexport 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 reexport 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 reexport, 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 }
1627
1628 register_diagnostics! {
1629 //  E0153, unused error code
1630 //  E0157, unused error code
1631 //  E0257,
1632 //  E0258,
1633 //  E0402, // cannot use an outer type parameter in this context
1634 //  E0406, merged into 420
1635 //  E0410, merged into 408
1636 //  E0413, merged into 530
1637 //  E0414, merged into 530
1638 //  E0417, merged into 532
1639 //  E0418, merged into 532
1640 //  E0419, merged into 531
1641 //  E0420, merged into 532
1642 //  E0421, merged into 531
1643     E0531, // unresolved pattern path kind `name`
1644 //  E0427, merged into 530
1645     E0573,
1646     E0574,
1647     E0575,
1648     E0576,
1649     E0577,
1650     E0578,
1651 }