]> git.lizzy.rs Git - rust.git/blob - src/librustc_resolve/diagnostics.rs
Auto merge of #56926 - alexcrichton:update-stdsimd, r=TimNN
[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 extern crate core;
299 extern crate std as core;
300
301 fn main() {}
302 ```
303
304 The solution is to choose a different name that doesn't conflict with any
305 external crate imported into the current module.
306
307 Correct example:
308
309 ```
310 extern crate core;
311 extern crate std as other_name;
312
313 fn main() {}
314 ```
315 "##,
316
317 E0260: r##"
318 The name for an item declaration conflicts with an external crate's name.
319
320 Erroneous code example:
321
322 ```compile_fail,E0260
323 extern crate core;
324
325 struct core;
326
327 fn main() {}
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 parameters 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 use something which is not a trait in a trait position, such as
553 a bound or `impl`.
554
555 Erroneous code example:
556
557 ```compile_fail,E0404
558 struct Foo;
559 struct Bar;
560
561 impl Foo for Bar {} // error: `Foo` is not a trait
562 ```
563
564 Another erroneous code example:
565
566 ```compile_fail,E0404
567 struct Foo;
568
569 fn bar<T: Foo>(t: T) {} // error: `Foo` is not a trait
570 ```
571
572 Please verify that you didn't misspell the trait's name or otherwise use the
573 wrong identifier. Example:
574
575 ```
576 trait Foo {
577     // some functions
578 }
579 struct Bar;
580
581 impl Foo for Bar { // ok!
582     // functions implementation
583 }
584 ```
585
586 or
587
588 ```
589 trait Foo {
590     // some functions
591 }
592
593 fn bar<T: Foo>(t: T) {} // ok!
594 ```
595
596 "##,
597
598 E0405: r##"
599 The code refers to a trait that is not in scope.
600
601 Erroneous code example:
602
603 ```compile_fail,E0405
604 struct Foo;
605
606 impl SomeTrait for Foo {} // error: trait `SomeTrait` is not in scope
607 ```
608
609 Please verify that the name of the trait wasn't misspelled and ensure that it
610 was imported. Example:
611
612 ```
613 # #[cfg(for_demonstration_only)]
614 // solution 1:
615 use some_file::SomeTrait;
616
617 // solution 2:
618 trait SomeTrait {
619     // some functions
620 }
621
622 struct Foo;
623
624 impl SomeTrait for Foo { // ok!
625     // implements functions
626 }
627 ```
628 "##,
629
630 E0407: r##"
631 A definition of a method not in the implemented trait was given in a trait
632 implementation.
633
634 Erroneous code example:
635
636 ```compile_fail,E0407
637 trait Foo {
638     fn a();
639 }
640
641 struct Bar;
642
643 impl Foo for Bar {
644     fn a() {}
645     fn b() {} // error: method `b` is not a member of trait `Foo`
646 }
647 ```
648
649 Please verify you didn't misspell the method name and you used the correct
650 trait. First example:
651
652 ```
653 trait Foo {
654     fn a();
655     fn b();
656 }
657
658 struct Bar;
659
660 impl Foo for Bar {
661     fn a() {}
662     fn b() {} // ok!
663 }
664 ```
665
666 Second example:
667
668 ```
669 trait Foo {
670     fn a();
671 }
672
673 struct Bar;
674
675 impl Foo for Bar {
676     fn a() {}
677 }
678
679 impl Bar {
680     fn b() {}
681 }
682 ```
683 "##,
684
685 E0408: r##"
686 An "or" pattern was used where the variable bindings are not consistently bound
687 across patterns.
688
689 Erroneous code example:
690
691 ```compile_fail,E0408
692 match x {
693     Some(y) | None => { /* use y */ } // error: variable `y` from pattern #1 is
694                                       //        not bound in pattern #2
695     _ => ()
696 }
697 ```
698
699 Here, `y` is bound to the contents of the `Some` and can be used within the
700 block corresponding to the match arm. However, in case `x` is `None`, we have
701 not specified what `y` is, and the block will use a nonexistent variable.
702
703 To fix this error, either split into multiple match arms:
704
705 ```
706 let x = Some(1);
707 match x {
708     Some(y) => { /* use y */ }
709     None => { /* ... */ }
710 }
711 ```
712
713 or, bind the variable to a field of the same type in all sub-patterns of the
714 or pattern:
715
716 ```
717 let x = (0, 2);
718 match x {
719     (0, y) | (y, 0) => { /* use y */}
720     _ => {}
721 }
722 ```
723
724 In this example, if `x` matches the pattern `(0, _)`, the second field is set
725 to `y`. If it matches `(_, 0)`, the first field is set to `y`; so in all
726 cases `y` is set to some value.
727 "##,
728
729 E0409: r##"
730 An "or" pattern was used where the variable bindings are not consistently bound
731 across patterns.
732
733 Erroneous code example:
734
735 ```compile_fail,E0409
736 let x = (0, 2);
737 match x {
738     (0, ref y) | (y, 0) => { /* use y */} // error: variable `y` is bound with
739                                           //        different mode in pattern #2
740                                           //        than in pattern #1
741     _ => ()
742 }
743 ```
744
745 Here, `y` is bound by-value in one case and by-reference in the other.
746
747 To fix this error, just use the same mode in both cases.
748 Generally using `ref` or `ref mut` where not already used will fix this:
749
750 ```
751 let x = (0, 2);
752 match x {
753     (0, ref y) | (ref y, 0) => { /* use y */}
754     _ => ()
755 }
756 ```
757
758 Alternatively, split the pattern:
759
760 ```
761 let x = (0, 2);
762 match x {
763     (y, 0) => { /* use y */ }
764     (0, ref y) => { /* use y */}
765     _ => ()
766 }
767 ```
768 "##,
769
770 E0411: r##"
771 The `Self` keyword was used outside an impl, trait, or type definition.
772
773 Erroneous code example:
774
775 ```compile_fail,E0411
776 <Self>::foo; // error: use of `Self` outside of an impl, trait, or type
777              // definition
778 ```
779
780 The `Self` keyword represents the current type, which explains why it can only
781 be used inside an impl, trait, or type definition. It gives access to the
782 associated items of a type:
783
784 ```
785 trait Foo {
786     type Bar;
787 }
788
789 trait Baz : Foo {
790     fn bar() -> Self::Bar; // like this
791 }
792 ```
793
794 However, be careful when two types have a common associated type:
795
796 ```compile_fail
797 trait Foo {
798     type Bar;
799 }
800
801 trait Foo2 {
802     type Bar;
803 }
804
805 trait Baz : Foo + Foo2 {
806     fn bar() -> Self::Bar;
807     // error: ambiguous associated type `Bar` in bounds of `Self`
808 }
809 ```
810
811 This problem can be solved by specifying from which trait we want to use the
812 `Bar` type:
813
814 ```
815 trait Foo {
816     type Bar;
817 }
818
819 trait Foo2 {
820     type Bar;
821 }
822
823 trait Baz : Foo + Foo2 {
824     fn bar() -> <Self as Foo>::Bar; // ok!
825 }
826 ```
827 "##,
828
829 E0412: r##"
830 The type name used is not in scope.
831
832 Erroneous code examples:
833
834 ```compile_fail,E0412
835 impl Something {} // error: type name `Something` is not in scope
836
837 // or:
838
839 trait Foo {
840     fn bar(N); // error: type name `N` is not in scope
841 }
842
843 // or:
844
845 fn foo(x: T) {} // type name `T` is not in scope
846 ```
847
848 To fix this error, please verify you didn't misspell the type name, you did
849 declare it or imported it into the scope. Examples:
850
851 ```
852 struct Something;
853
854 impl Something {} // ok!
855
856 // or:
857
858 trait Foo {
859     type N;
860
861     fn bar(_: Self::N); // ok!
862 }
863
864 // or:
865
866 fn foo<T>(x: T) {} // ok!
867 ```
868
869 Another case that causes this error is when a type is imported into a parent
870 module. To fix this, you can follow the suggestion and use File directly or
871 `use super::File;` which will import the types from the parent namespace. An
872 example that causes this error is below:
873
874 ```compile_fail,E0412
875 use std::fs::File;
876
877 mod foo {
878     fn some_function(f: File) {}
879 }
880 ```
881
882 ```
883 use std::fs::File;
884
885 mod foo {
886     // either
887     use super::File;
888     // or
889     // use std::fs::File;
890     fn foo(f: File) {}
891 }
892 # fn main() {} // don't insert it for us; that'll break imports
893 ```
894 "##,
895
896 E0415: r##"
897 More than one function parameter have the same name.
898
899 Erroneous code example:
900
901 ```compile_fail,E0415
902 fn foo(f: i32, f: i32) {} // error: identifier `f` is bound more than
903                           //        once in this parameter list
904 ```
905
906 Please verify you didn't misspell parameters' name. Example:
907
908 ```
909 fn foo(f: i32, g: i32) {} // ok!
910 ```
911 "##,
912
913 E0416: r##"
914 An identifier is bound more than once in a pattern.
915
916 Erroneous code example:
917
918 ```compile_fail,E0416
919 match (1, 2) {
920     (x, x) => {} // error: identifier `x` is bound more than once in the
921                  //        same pattern
922 }
923 ```
924
925 Please verify you didn't misspell identifiers' name. Example:
926
927 ```
928 match (1, 2) {
929     (x, y) => {} // ok!
930 }
931 ```
932
933 Or maybe did you mean to unify? Consider using a guard:
934
935 ```
936 # let (A, B, C) = (1, 2, 3);
937 match (A, B, C) {
938     (x, x2, see) if x == x2 => { /* A and B are equal, do one thing */ }
939     (y, z, see) => { /* A and B unequal; do another thing */ }
940 }
941 ```
942 "##,
943
944 E0422: r##"
945 You are trying to use an identifier that is either undefined or not a struct.
946 Erroneous code example:
947
948 ```compile_fail,E0422
949 fn main () {
950     let x = Foo { x: 1, y: 2 };
951 }
952 ```
953
954 In this case, `Foo` is undefined, so it inherently isn't anything, and
955 definitely not a struct.
956
957 ```compile_fail
958 fn main () {
959     let foo = 1;
960     let x = foo { x: 1, y: 2 };
961 }
962 ```
963
964 In this case, `foo` is defined, but is not a struct, so Rust can't use it as
965 one.
966 "##,
967
968 E0423: r##"
969 An identifier was used like a function name or a value was expected and the
970 identifier exists but it belongs to a different namespace.
971
972 For (an erroneous) example, here a `struct` variant name were used as a
973 function:
974
975 ```compile_fail,E0423
976 struct Foo { a: bool };
977
978 let f = Foo();
979 // error: expected function, found `Foo`
980 // `Foo` is a struct name, but this expression uses it like a function name
981 ```
982
983 Please verify you didn't misspell the name of what you actually wanted to use
984 here. Example:
985
986 ```
987 fn Foo() -> u32 { 0 }
988
989 let f = Foo(); // ok!
990 ```
991
992 It is common to forget the trailing `!` on macro invocations, which would also
993 yield this error:
994
995 ```compile_fail,E0423
996 println("");
997 // error: expected function, found macro `println`
998 // did you mean `println!(...)`? (notice the trailing `!`)
999 ```
1000
1001 Another case where this error is emitted is when a value is expected, but
1002 something else is found:
1003
1004 ```compile_fail,E0423
1005 pub mod a {
1006     pub const I: i32 = 1;
1007 }
1008
1009 fn h1() -> i32 {
1010     a.I
1011     //~^ ERROR expected value, found module `a`
1012     // did you mean `a::I`?
1013 }
1014 ```
1015 "##,
1016
1017 E0424: r##"
1018 The `self` keyword was used in a static method.
1019
1020 Erroneous code example:
1021
1022 ```compile_fail,E0424
1023 struct Foo;
1024
1025 impl Foo {
1026     fn bar(self) {}
1027
1028     fn foo() {
1029         self.bar(); // error: `self` is not available in a static method.
1030     }
1031 }
1032 ```
1033
1034 Please check if the method's argument list should have contained `self`,
1035 `&self`, or `&mut self` (in case you didn't want to create a static
1036 method), and add it if so. Example:
1037
1038 ```
1039 struct Foo;
1040
1041 impl Foo {
1042     fn bar(self) {}
1043
1044     fn foo(self) {
1045         self.bar(); // ok!
1046     }
1047 }
1048 ```
1049 "##,
1050
1051 E0425: r##"
1052 An unresolved name was used.
1053
1054 Erroneous code examples:
1055
1056 ```compile_fail,E0425
1057 something_that_doesnt_exist::foo;
1058 // error: unresolved name `something_that_doesnt_exist::foo`
1059
1060 // or:
1061
1062 trait Foo {
1063     fn bar() {
1064         Self; // error: unresolved name `Self`
1065     }
1066 }
1067
1068 // or:
1069
1070 let x = unknown_variable;  // error: unresolved name `unknown_variable`
1071 ```
1072
1073 Please verify that the name wasn't misspelled and ensure that the
1074 identifier being referred to is valid for the given situation. Example:
1075
1076 ```
1077 enum something_that_does_exist {
1078     Foo,
1079 }
1080 ```
1081
1082 Or:
1083
1084 ```
1085 mod something_that_does_exist {
1086     pub static foo : i32 = 0i32;
1087 }
1088
1089 something_that_does_exist::foo; // ok!
1090 ```
1091
1092 Or:
1093
1094 ```
1095 let unknown_variable = 12u32;
1096 let x = unknown_variable; // ok!
1097 ```
1098
1099 If the item is not defined in the current module, it must be imported using a
1100 `use` statement, like so:
1101
1102 ```
1103 # mod foo { pub fn bar() {} }
1104 # fn main() {
1105 use foo::bar;
1106 bar();
1107 # }
1108 ```
1109
1110 If the item you are importing is not defined in some super-module of the
1111 current module, then it must also be declared as public (e.g., `pub fn`).
1112 "##,
1113
1114 E0426: r##"
1115 An undeclared label was used.
1116
1117 Erroneous code example:
1118
1119 ```compile_fail,E0426
1120 loop {
1121     break 'a; // error: use of undeclared label `'a`
1122 }
1123 ```
1124
1125 Please verify you spelt or declare the label correctly. Example:
1126
1127 ```
1128 'a: loop {
1129     break 'a; // ok!
1130 }
1131 ```
1132 "##,
1133
1134 E0428: r##"
1135 A type or module has been defined more than once.
1136
1137 Erroneous code example:
1138
1139 ```compile_fail,E0428
1140 struct Bar;
1141 struct Bar; // error: duplicate definition of value `Bar`
1142 ```
1143
1144 Please verify you didn't misspell the type/module's name or remove/rename the
1145 duplicated one. Example:
1146
1147 ```
1148 struct Bar;
1149 struct Bar2; // ok!
1150 ```
1151 "##,
1152
1153 E0429: r##"
1154 The `self` keyword cannot appear alone as the last segment in a `use`
1155 declaration.
1156
1157 Erroneous code example:
1158
1159 ```compile_fail,E0429
1160 use std::fmt::self; // error: `self` imports are only allowed within a { } list
1161 ```
1162
1163 To use a namespace itself in addition to some of its members, `self` may appear
1164 as part of a brace-enclosed list of imports:
1165
1166 ```
1167 use std::fmt::{self, Debug};
1168 ```
1169
1170 If you only want to import the namespace, do so directly:
1171
1172 ```
1173 use std::fmt;
1174 ```
1175 "##,
1176
1177 E0430: r##"
1178 The `self` import appears more than once in the list.
1179
1180 Erroneous code example:
1181
1182 ```compile_fail,E0430
1183 use something::{self, self}; // error: `self` import can only appear once in
1184                              //        the list
1185 ```
1186
1187 Please verify you didn't misspell the import name or remove the duplicated
1188 `self` import. Example:
1189
1190 ```
1191 # mod something {}
1192 # fn main() {
1193 use something::{self}; // ok!
1194 # }
1195 ```
1196 "##,
1197
1198 E0431: r##"
1199 An invalid `self` import was made.
1200
1201 Erroneous code example:
1202
1203 ```compile_fail,E0431
1204 use {self}; // error: `self` import can only appear in an import list with a
1205             //        non-empty prefix
1206 ```
1207
1208 You cannot import the current module into itself, please remove this import
1209 or verify you didn't misspell it.
1210 "##,
1211
1212 E0432: r##"
1213 An import was unresolved.
1214
1215 Erroneous code example:
1216
1217 ```compile_fail,E0432
1218 use something::Foo; // error: unresolved import `something::Foo`.
1219 ```
1220
1221 Paths in `use` statements are relative to the crate root. To import items
1222 relative to the current and parent modules, use the `self::` and `super::`
1223 prefixes, respectively. Also verify that you didn't misspell the import
1224 name and that the import exists in the module from where you tried to
1225 import it. Example:
1226
1227 ```
1228 use self::something::Foo; // ok!
1229
1230 mod something {
1231     pub struct Foo;
1232 }
1233 # fn main() {}
1234 ```
1235
1236 Or, if you tried to use a module from an external crate, you may have missed
1237 the `extern crate` declaration (which is usually placed in the crate root):
1238
1239 ```
1240 extern crate core; // Required to use the `core` crate
1241
1242 use core::any;
1243 # fn main() {}
1244 ```
1245 "##,
1246
1247 E0433: r##"
1248 An undeclared type or module was used.
1249
1250 Erroneous code example:
1251
1252 ```compile_fail,E0433
1253 let map = HashMap::new();
1254 // error: failed to resolve: use of undeclared type or module `HashMap`
1255 ```
1256
1257 Please verify you didn't misspell the type/module's name or that you didn't
1258 forget to import it:
1259
1260
1261 ```
1262 use std::collections::HashMap; // HashMap has been imported.
1263 let map: HashMap<u32, u32> = HashMap::new(); // So it can be used!
1264 ```
1265 "##,
1266
1267 E0434: r##"
1268 This error indicates that a variable usage inside an inner function is invalid
1269 because the variable comes from a dynamic environment. Inner functions do not
1270 have access to their containing environment.
1271
1272 Erroneous code example:
1273
1274 ```compile_fail,E0434
1275 fn foo() {
1276     let y = 5;
1277     fn bar() -> u32 {
1278         y // error: can't capture dynamic environment in a fn item; use the
1279           //        || { ... } closure form instead.
1280     }
1281 }
1282 ```
1283
1284 Functions do not capture local variables. To fix this error, you can replace the
1285 function with a closure:
1286
1287 ```
1288 fn foo() {
1289     let y = 5;
1290     let bar = || {
1291         y
1292     };
1293 }
1294 ```
1295
1296 or replace the captured variable with a constant or a static item:
1297
1298 ```
1299 fn foo() {
1300     static mut X: u32 = 4;
1301     const Y: u32 = 5;
1302     fn bar() -> u32 {
1303         unsafe {
1304             X = 3;
1305         }
1306         Y
1307     }
1308 }
1309 ```
1310 "##,
1311
1312 E0435: r##"
1313 A non-constant value was used in a constant expression.
1314
1315 Erroneous code example:
1316
1317 ```compile_fail,E0435
1318 let foo = 42;
1319 let a: [u8; foo]; // error: attempt to use a non-constant value in a constant
1320 ```
1321
1322 To fix this error, please replace the value with a constant. Example:
1323
1324 ```
1325 let a: [u8; 42]; // ok!
1326 ```
1327
1328 Or:
1329
1330 ```
1331 const FOO: usize = 42;
1332 let a: [u8; FOO]; // ok!
1333 ```
1334 "##,
1335
1336 E0437: r##"
1337 Trait implementations can only implement associated types that are members of
1338 the trait in question. This error indicates that you attempted to implement
1339 an associated type whose name does not match the name of any associated type
1340 in the trait.
1341
1342 Erroneous code example:
1343
1344 ```compile_fail,E0437
1345 trait Foo {}
1346
1347 impl Foo for i32 {
1348     type Bar = bool;
1349 }
1350 ```
1351
1352 The solution to this problem is to remove the extraneous associated type:
1353
1354 ```
1355 trait Foo {}
1356
1357 impl Foo for i32 {}
1358 ```
1359 "##,
1360
1361 E0438: r##"
1362 Trait implementations can only implement associated constants that are
1363 members of the trait in question. This error indicates that you
1364 attempted to implement an associated constant whose name does not
1365 match the name of any associated constant in the trait.
1366
1367 Erroneous code example:
1368
1369 ```compile_fail,E0438
1370 trait Foo {}
1371
1372 impl Foo for i32 {
1373     const BAR: bool = true;
1374 }
1375 ```
1376
1377 The solution to this problem is to remove the extraneous associated constant:
1378
1379 ```
1380 trait Foo {}
1381
1382 impl Foo for i32 {}
1383 ```
1384 "##,
1385
1386 E0466: r##"
1387 Macro import declarations were malformed.
1388
1389 Erroneous code examples:
1390
1391 ```compile_fail,E0466
1392 #[macro_use(a_macro(another_macro))] // error: invalid import declaration
1393 extern crate core as some_crate;
1394
1395 #[macro_use(i_want = "some_macros")] // error: invalid import declaration
1396 extern crate core as another_crate;
1397 ```
1398
1399 This is a syntax error at the level of attribute declarations. The proper
1400 syntax for macro imports is the following:
1401
1402 ```ignore (cannot-doctest-multicrate-project)
1403 // In some_crate:
1404 #[macro_export]
1405 macro_rules! get_tacos {
1406     ...
1407 }
1408
1409 #[macro_export]
1410 macro_rules! get_pimientos {
1411     ...
1412 }
1413
1414 // In your crate:
1415 #[macro_use(get_tacos, get_pimientos)] // It imports `get_tacos` and
1416 extern crate some_crate;               // `get_pimientos` macros from some_crate
1417 ```
1418
1419 If you would like to import all exported macros, write `macro_use` with no
1420 arguments.
1421 "##,
1422
1423 E0468: r##"
1424 A non-root module attempts to import macros from another crate.
1425
1426 Example of erroneous code:
1427
1428 ```compile_fail,E0468
1429 mod foo {
1430     #[macro_use(debug_assert)]  // error: must be at crate root to import
1431     extern crate core;          //        macros from another crate
1432     fn run_macro() { debug_assert!(true); }
1433 }
1434 ```
1435
1436 Only `extern crate` imports at the crate root level are allowed to import
1437 macros.
1438
1439 Either move the macro import to crate root or do without the foreign macros.
1440 This will work:
1441
1442 ```
1443 #[macro_use(debug_assert)]
1444 extern crate core;
1445
1446 mod foo {
1447     fn run_macro() { debug_assert!(true); }
1448 }
1449 # fn main() {}
1450 ```
1451 "##,
1452
1453 E0469: r##"
1454 A macro listed for import was not found.
1455
1456 Erroneous code example:
1457
1458 ```compile_fail,E0469
1459 #[macro_use(drink, be_merry)] // error: imported macro not found
1460 extern crate alloc;
1461
1462 fn main() {
1463     // ...
1464 }
1465 ```
1466
1467 Either the listed macro is not contained in the imported crate, or it is not
1468 exported from the given crate.
1469
1470 This could be caused by a typo. Did you misspell the macro's name?
1471
1472 Double-check the names of the macros listed for import, and that the crate
1473 in question exports them.
1474
1475 A working version would be:
1476
1477 ```ignore (cannot-doctest-multicrate-project)
1478 // In some_crate crate:
1479 #[macro_export]
1480 macro_rules! eat {
1481     ...
1482 }
1483
1484 #[macro_export]
1485 macro_rules! drink {
1486     ...
1487 }
1488
1489 // In your crate:
1490 #[macro_use(eat, drink)]
1491 extern crate some_crate; //ok!
1492 ```
1493 "##,
1494
1495 E0530: r##"
1496 A binding shadowed something it shouldn't.
1497
1498 Erroneous code example:
1499
1500 ```compile_fail,E0530
1501 static TEST: i32 = 0;
1502
1503 let r: (i32, i32) = (0, 0);
1504 match r {
1505     TEST => {} // error: match bindings cannot shadow statics
1506 }
1507 ```
1508
1509 To fix this error, just change the binding's name in order to avoid shadowing
1510 one of the following:
1511
1512 * struct name
1513 * struct/enum variant
1514 * static
1515 * const
1516 * associated const
1517
1518 Fixed example:
1519
1520 ```
1521 static TEST: i32 = 0;
1522
1523 let r: (i32, i32) = (0, 0);
1524 match r {
1525     something => {} // ok!
1526 }
1527 ```
1528 "##,
1529
1530 E0532: r##"
1531 Pattern arm did not match expected kind.
1532
1533 Erroneous code example:
1534
1535 ```compile_fail,E0532
1536 enum State {
1537     Succeeded,
1538     Failed(String),
1539 }
1540
1541 fn print_on_failure(state: &State) {
1542     match *state {
1543         // error: expected unit struct/variant or constant, found tuple
1544         //        variant `State::Failed`
1545         State::Failed => println!("Failed"),
1546         _ => ()
1547     }
1548 }
1549 ```
1550
1551 To fix this error, ensure the match arm kind is the same as the expression
1552 matched.
1553
1554 Fixed example:
1555
1556 ```
1557 enum State {
1558     Succeeded,
1559     Failed(String),
1560 }
1561
1562 fn print_on_failure(state: &State) {
1563     match *state {
1564         State::Failed(ref msg) => println!("Failed with {}", msg),
1565         _ => ()
1566     }
1567 }
1568 ```
1569 "##,
1570
1571 E0603: r##"
1572 A private item was used outside its scope.
1573
1574 Erroneous code example:
1575
1576 ```compile_fail,E0603
1577 mod SomeModule {
1578     const PRIVATE: u32 = 0x_a_bad_1dea_u32; // This const is private, so we
1579                                             // can't use it outside of the
1580                                             // `SomeModule` module.
1581 }
1582
1583 println!("const value: {}", SomeModule::PRIVATE); // error: constant `PRIVATE`
1584                                                   //        is private
1585 ```
1586
1587 In order to fix this error, you need to make the item public by using the `pub`
1588 keyword. Example:
1589
1590 ```
1591 mod SomeModule {
1592     pub const PRIVATE: u32 = 0x_a_bad_1dea_u32; // We set it public by using the
1593                                                 // `pub` keyword.
1594 }
1595
1596 println!("const value: {}", SomeModule::PRIVATE); // ok!
1597 ```
1598 "##,
1599
1600 E0659: r##"
1601 An item usage is ambiguous.
1602
1603 Erroneous code example:
1604
1605 ```compile_fail,E0659
1606 pub mod moon {
1607     pub fn foo() {}
1608 }
1609
1610 pub mod earth {
1611     pub fn foo() {}
1612 }
1613
1614 mod collider {
1615     pub use moon::*;
1616     pub use earth::*;
1617 }
1618
1619 fn main() {
1620     collider::foo(); // ERROR: `foo` is ambiguous
1621 }
1622 ```
1623
1624 This error generally appears when two items with the same name are imported into
1625 a module. Here, the `foo` functions are imported and reexported from the
1626 `collider` module and therefore, when we're using `collider::foo()`, both
1627 functions collide.
1628
1629 To solve this error, the best solution is generally to keep the path before the
1630 item when using it. Example:
1631
1632 ```
1633 pub mod moon {
1634     pub fn foo() {}
1635 }
1636
1637 pub mod earth {
1638     pub fn foo() {}
1639 }
1640
1641 mod collider {
1642     pub use moon;
1643     pub use earth;
1644 }
1645
1646 fn main() {
1647     collider::moon::foo(); // ok!
1648     collider::earth::foo(); // ok!
1649 }
1650 ```
1651 "##,
1652
1653 }
1654
1655 register_diagnostics! {
1656 //  E0153, unused error code
1657 //  E0157, unused error code
1658 //  E0257,
1659 //  E0258,
1660 //  E0402, // cannot use an outer type parameter in this context
1661 //  E0406, merged into 420
1662 //  E0410, merged into 408
1663 //  E0413, merged into 530
1664 //  E0414, merged into 530
1665 //  E0417, merged into 532
1666 //  E0418, merged into 532
1667 //  E0419, merged into 531
1668 //  E0420, merged into 532
1669 //  E0421, merged into 531
1670     E0531, // unresolved pattern path kind `name`
1671 //  E0427, merged into 530
1672 //  E0467, removed
1673 //  E0470, removed
1674     E0573,
1675     E0574,
1676     E0575,
1677     E0576,
1678     E0577,
1679     E0578,
1680 }