]> git.lizzy.rs Git - rust.git/blob - src/librustc_resolve/diagnostics.rs
Auto merge of #31077 - nagisa:mir-temp-promotion, r=dotdash
[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 E0154: r##"
19 Imports (`use` statements) are not allowed after non-item statements, such as
20 variable declarations and expression statements.
21
22 Here is an example that demonstrates the error:
23
24 ```
25 fn f() {
26     // Variable declaration before import
27     let x = 0;
28     use std::io::Read;
29     ...
30 }
31 ```
32
33 The solution is to declare the imports at the top of the block, function, or
34 file.
35
36 Here is the previous example again, with the correct order:
37
38 ```
39 fn f() {
40     use std::io::Read;
41     let x = 0;
42     ...
43 }
44 ```
45
46 See the Declaration Statements section of the reference for more information
47 about what constitutes an Item declaration and what does not:
48
49 https://doc.rust-lang.org/reference.html#statements
50 "##,
51
52 E0251: r##"
53 Two items of the same name cannot be imported without rebinding one of the
54 items under a new local name.
55
56 An example of this error:
57
58 ```
59 use foo::baz;
60 use bar::*; // error, do `use foo::baz as quux` instead on the previous line
61
62 fn main() {}
63
64 mod foo {
65     pub struct baz;
66 }
67
68 mod bar {
69     pub mod baz {}
70 }
71 ```
72 "##,
73
74 E0252: r##"
75 Two items of the same name cannot be imported without rebinding one of the
76 items under a new local name.
77
78 An example of this error:
79
80 ```
81 use foo::baz;
82 use bar::baz; // error, do `use bar::baz as quux` instead
83
84 fn main() {}
85
86 mod foo {
87     pub struct baz;
88 }
89
90 mod bar {
91     pub mod baz {}
92 }
93 ```
94 "##,
95
96 E0253: r##"
97 Attempt was made to import an unimportable value. This can happen when
98 trying to import a method from a trait. An example of this error:
99
100 ```
101 mod foo {
102     pub trait MyTrait {
103         fn do_something();
104     }
105 }
106 use foo::MyTrait::do_something;
107 ```
108
109 It's invalid to directly import methods belonging to a trait or concrete type.
110 "##,
111
112 E0255: r##"
113 You can't import a value whose name is the same as another value defined in the
114 module.
115
116 An example of this error:
117
118 ```
119 use bar::foo; // error, do `use bar::foo as baz` instead
120
121 fn foo() {}
122
123 mod bar {
124      pub fn foo() {}
125 }
126
127 fn main() {}
128 ```
129 "##,
130
131 E0256: r##"
132 You can't import a type or module when the name of the item being imported is
133 the same as another type or submodule defined in the module.
134
135 An example of this error:
136
137 ```
138 use foo::Bar; // error
139
140 type Bar = u32;
141
142 mod foo {
143     pub mod Bar { }
144 }
145
146 fn main() {}
147 ```
148 "##,
149
150 E0259: r##"
151 The name chosen for an external crate conflicts with another external crate that
152 has been imported into the current module.
153
154 Wrong example:
155
156 ```
157 extern crate a;
158 extern crate crate_a as a;
159 ```
160
161 The solution is to choose a different name that doesn't conflict with any
162 external crate imported into the current module.
163
164 Correct example:
165
166 ```
167 extern crate a;
168 extern crate crate_a as other_name;
169 ```
170 "##,
171
172 E0260: r##"
173 The name for an item declaration conflicts with an external crate's name.
174
175 For instance,
176
177 ```
178 extern crate abc;
179
180 struct abc;
181 ```
182
183 There are two possible solutions:
184
185 Solution #1: Rename the item.
186
187 ```
188 extern crate abc;
189
190 struct xyz;
191 ```
192
193 Solution #2: Import the crate with a different name.
194
195 ```
196 extern crate abc as xyz;
197
198 struct abc;
199 ```
200
201 See the Declaration Statements section of the reference for more information
202 about what constitutes an Item declaration and what does not:
203
204 https://doc.rust-lang.org/reference.html#statements
205 "##,
206
207 E0317: r##"
208 User-defined types or type parameters cannot shadow the primitive types.
209 This error indicates you tried to define a type, struct or enum with the same
210 name as an existing primitive type.
211
212 See the Types section of the reference for more information about the primitive
213 types:
214
215 https://doc.rust-lang.org/reference.html#types
216 "##,
217
218 E0364: r##"
219 Private items cannot be publicly re-exported.  This error indicates that
220 you attempted to `pub use` a type or value that was not itself public.
221
222 Here is an example that demonstrates the error:
223
224 ```
225 mod foo {
226     const X: u32 = 1;
227 }
228 pub use foo::X;
229 ```
230
231 The solution to this problem is to ensure that the items that you are
232 re-exporting are themselves marked with `pub`:
233
234 ```
235 mod foo {
236     pub const X: u32 = 1;
237 }
238 pub use foo::X;
239 ```
240
241 See the 'Use Declarations' section of the reference for more information
242 on this topic:
243
244 https://doc.rust-lang.org/reference.html#use-declarations
245 "##,
246
247 E0365: r##"
248 Private modules cannot be publicly re-exported.  This error indicates
249 that you attempted to `pub use` a module that was not itself public.
250
251 Here is an example that demonstrates the error:
252
253 ```
254 mod foo {
255     pub const X: u32 = 1;
256 }
257 pub use foo as foo2;
258
259 ```
260 The solution to this problem is to ensure that the module that you are
261 re-exporting is itself marked with `pub`:
262
263 ```
264 pub mod foo {
265     pub const X: u32 = 1;
266 }
267 pub use foo as foo2;
268 ```
269
270 See the 'Use Declarations' section of the reference for more information
271 on this topic:
272
273 https://doc.rust-lang.org/reference.html#use-declarations
274 "##,
275
276 E0401: r##"
277 Inner items do not inherit type parameters from the functions they are
278 embedded in. For example, this will not compile:
279
280 ```
281 fn foo<T>(x: T) {
282     fn bar(y: T) { // T is defined in the "outer" function
283         // ..
284     }
285     bar(x);
286 }
287 ```
288
289 nor will this:
290
291 ```
292 fn foo<T>(x: T) {
293     type MaybeT = Option<T>;
294     // ...
295 }
296 ```
297
298 or this:
299
300 ```
301 fn foo<T>(x: T) {
302     struct Foo {
303         x: T,
304     }
305     // ...
306 }
307 ```
308
309 Items inside functions are basically just like top-level items, except
310 that they can only be used from the function they are in.
311
312 There are a couple of solutions for this.
313
314 If the item is a function, you may use a closure:
315
316 ```
317 fn foo<T>(x: T) {
318     let bar = |y: T| { // explicit type annotation may not be necessary
319         // ..
320     }
321     bar(x);
322 }
323 ```
324
325 For a generic item, you can copy over the parameters:
326
327 ```
328 fn foo<T>(x: T) {
329     fn bar<T>(y: T) {
330         // ..
331     }
332     bar(x);
333 }
334 ```
335
336 ```
337 fn foo<T>(x: T) {
338     type MaybeT<T> = Option<T>;
339 }
340 ```
341
342 Be sure to copy over any bounds as well:
343
344 ```
345 fn foo<T: Copy>(x: T) {
346     fn bar<T: Copy>(y: T) {
347         // ..
348     }
349     bar(x);
350 }
351 ```
352
353 ```
354 fn foo<T: Copy>(x: T) {
355     struct Foo<T: Copy> {
356         x: T,
357     }
358 }
359 ```
360
361 This may require additional type hints in the function body.
362
363 In case the item is a function inside an `impl`, defining a private helper
364 function might be easier:
365
366 ```
367 impl<T> Foo<T> {
368     pub fn foo(&self, x: T) {
369         self.bar(x);
370     }
371     fn bar(&self, y: T) {
372         // ..
373     }
374 }
375 ```
376
377 For default impls in traits, the private helper solution won't work, however
378 closures or copying the parameters should still work.
379 "##,
380
381 E0403: r##"
382 Some type parameters have the same name. Example of erroneous code:
383
384 ```
385 fn foo<T, T>(s: T, u: T) {} // error: the name `T` is already used for a type
386                             //        parameter in this type parameter list
387 ```
388
389 Please verify that none of the type parameterss are misspelled, and rename any
390 clashing parameters. Example:
391
392 ```
393 fn foo<T, Y>(s: T, u: Y) {} // ok!
394 ```
395 "##,
396
397 E0404: r##"
398 You tried to implement something which was not a trait on an object. Example of
399 erroneous code:
400
401 ```
402 struct Foo;
403 struct Bar;
404
405 impl Foo for Bar {} // error: `Foo` is not a trait
406 ```
407
408 Please verify that you didn't misspell the trait's name or otherwise use the
409 wrong identifier. Example:
410
411 ```
412 trait Foo {
413     // some functions
414 }
415 struct Bar;
416
417 impl Foo for Bar { // ok!
418     // functions implementation
419 }
420 ```
421 "##,
422
423 E0405: r##"
424 An unknown trait was implemented. Example of erroneous code:
425
426 ```
427 struct Foo;
428
429 impl SomeTrait for Foo {} // error: use of undeclared trait name `SomeTrait`
430 ```
431
432 Please verify that the name of the trait wasn't misspelled and ensure that it
433 was imported. Example:
434
435 ```
436 // solution 1:
437 use some_file::SomeTrait;
438
439 // solution 2:
440 trait SomeTrait {
441     // some functions
442 }
443
444 struct Foo;
445
446 impl SomeTrait for Foo { // ok!
447     // implements functions
448 }
449 ```
450 "##,
451
452 E0407: r##"
453 A definition of a method not in the implemented trait was given in a trait
454 implementation. Example of erroneous code:
455
456 ```
457 trait Foo {
458     fn a();
459 }
460
461 struct Bar;
462
463 impl Foo for Bar {
464     fn a() {}
465     fn b() {} // error: method `b` is not a member of trait `Foo`
466 }
467 ```
468
469 Please verify you didn't misspell the method name and you used the correct
470 trait. First example:
471
472 ```
473 trait Foo {
474     fn a();
475     fn b();
476 }
477
478 struct Bar;
479
480 impl Foo for Bar {
481     fn a() {}
482     fn b() {} // ok!
483 }
484 ```
485
486 Second example:
487
488 ```
489 trait Foo {
490     fn a();
491 }
492
493 struct Bar;
494
495 impl Foo for Bar {
496     fn a() {}
497 }
498
499 impl Bar {
500     fn b() {}
501 }
502 ```
503 "##,
504
505 E0411: r##"
506 The `Self` keyword was used outside an impl or a trait. Erroneous
507 code example:
508
509 ```
510 <Self>::foo; // error: use of `Self` outside of an impl or trait
511 ```
512
513 The `Self` keyword represents the current type, which explains why it
514 can only be used inside an impl or a trait. It gives access to the
515 associated items of a type:
516
517 ```
518 trait Foo {
519     type Bar;
520 }
521
522 trait Baz : Foo {
523     fn bar() -> Self::Bar; // like this
524 }
525 ```
526
527 However, be careful when two types has a common associated type:
528
529 ```
530 trait Foo {
531     type Bar;
532 }
533
534 trait Foo2 {
535     type Bar;
536 }
537
538 trait Baz : Foo + Foo2 {
539     fn bar() -> Self::Bar;
540     // error: ambiguous associated type `Bar` in bounds of `Self`
541 }
542 ```
543
544 This problem can be solved by specifying from which trait we want
545 to use the `Bar` type:
546
547 ```
548 trait Baz : Foo + Foo2 {
549     fn bar() -> <Self as Foo>::Bar; // ok!
550 }
551 ```
552 "##,
553
554 E0412: r##"
555 An undeclared type name was used. Example of erroneous codes:
556
557 ```
558 impl Something {} // error: use of undeclared type name `Something`
559 // or:
560 trait Foo {
561     fn bar(N); // error: use of undeclared type name `N`
562 }
563 // or:
564 fn foo(x: T) {} // error: use of undeclared type name `T`
565 ```
566
567 To fix this error, please verify you didn't misspell the type name,
568 you did declare it or imported it into the scope. Examples:
569
570 ```
571 struct Something;
572
573 impl Something {} // ok!
574 // or:
575 trait Foo {
576     type N;
577
578     fn bar(Self::N); // ok!
579 }
580 //or:
581 fn foo<T>(x: T) {} // ok!
582 ```
583 "##,
584
585 E0413: r##"
586 A declaration shadows an enum variant or unit-like struct in scope.
587 Example of erroneous code:
588
589 ```
590 struct Foo;
591
592 let Foo = 12i32; // error: declaration of `Foo` shadows an enum variant or
593                  //        unit-like struct in scope
594 ```
595
596
597 To fix this error, rename the variable such that it doesn't shadow any enum
598 variable or structure in scope. Example:
599
600 ```
601 struct Foo;
602
603 let foo = 12i32; // ok!
604 ```
605
606 Or:
607
608 ```
609 struct FooStruct;
610
611 let Foo = 12i32; // ok!
612 ```
613
614 The goal here is to avoid a conflict of names.
615 "##,
616
617 E0415: r##"
618 More than one function parameter have the same name. Example of erroneous
619 code:
620
621 ```
622 fn foo(f: i32, f: i32) {} // error: identifier `f` is bound more than
623                           //        once in this parameter list
624 ```
625
626 Please verify you didn't misspell parameters' name. Example:
627
628 ```
629 fn foo(f: i32, g: i32) {} // ok!
630 ```
631 "##,
632
633 E0416: r##"
634 An identifier is bound more than once in a pattern. Example of erroneous
635 code:
636
637 ```
638 match (1, 2) {
639     (x, x) => {} // error: identifier `x` is bound more than once in the
640                  //        same pattern
641 }
642 ```
643
644 Please verify you didn't misspell identifiers' name. Example:
645
646 ```
647 match (1, 2) {
648     (x, y) => {} // ok!
649 }
650 ```
651
652 Or maybe did you mean to unify? Consider using a guard:
653
654 ```
655 match (A, B, C) {
656     (x, x2, see) if x == x2 => { /* A and B are equal, do one thing */ }
657     (y, z, see) => { /* A and B unequal; do another thing */ }
658 }
659 ```
660 "##,
661
662 E0417: r##"
663 A static variable was referenced in a pattern. Example of erroneous code:
664
665 ```
666 static FOO : i32 = 0;
667
668 match 0 {
669     FOO => {} // error: static variables cannot be referenced in a
670               //        pattern, use a `const` instead
671     _ => {}
672 }
673 ```
674
675 The compiler needs to know the value of the pattern at compile time;
676 compile-time patterns can defined via const or enum items. Please verify
677 that the identifier is spelled correctly, and if so, use a const instead
678 of static to define it. Example:
679
680 ```
681 const FOO : i32 = 0;
682
683 match 0 {
684     FOO => {} // ok!
685     _ => {}
686 }
687 ```
688 "##,
689
690 E0419: r##"
691 An unknown enum variant, struct or const was used. Example of
692 erroneous code:
693
694 ```
695 match 0 {
696     Something::Foo => {} // error: unresolved enum variant, struct
697                          //        or const `Foo`
698 }
699 ```
700
701 Please verify you didn't misspell it and the enum variant, struct or const has
702 been declared and imported into scope. Example:
703
704 ```
705 enum Something {
706     Foo,
707     NotFoo,
708 }
709
710 match Something::NotFoo {
711     Something::Foo => {} // ok!
712     _ => {}
713 }
714 ```
715 "##,
716
717 E0422: r##"
718 You are trying to use an identifier that is either undefined or not a
719 struct. For instance:
720 ```
721 fn main () {
722     let x = Foo { x: 1, y: 2 };
723 }
724 ```
725
726 In this case, `Foo` is undefined, so it inherently isn't anything, and
727 definitely not a struct.
728
729 ```
730 fn main () {
731     let foo = 1;
732     let x = foo { x: 1, y: 2 };
733 }
734 ```
735
736 In this case, `foo` is defined, but is not a struct, so Rust can't use
737 it as one.
738 "##,
739
740 E0423: r##"
741 A `struct` variant name was used like a function name. Example of
742 erroneous code:
743
744 ```
745 struct Foo { a: bool};
746
747 let f = Foo();
748 // error: `Foo` is a struct variant name, but this expression uses
749 //        it like a function name
750 ```
751
752 Please verify you didn't misspell the name of what you actually wanted
753 to use here. Example:
754
755 ```
756 fn Foo() -> u32 { 0 }
757
758 let f = Foo(); // ok!
759 ```
760 "##,
761
762 E0424: r##"
763 The `self` keyword was used in a static method. Example of erroneous code:
764
765 ```
766 struct Foo;
767
768 impl Foo {
769     fn bar(self) {}
770
771     fn foo() {
772         self.bar(); // error: `self` is not available in a static method.
773     }
774 }
775 ```
776
777 Please check if the method's argument list should have contained `self`,
778 `&self`, or `&mut self` (in case you didn't want to create a static
779 method), and add it if so. Example:
780
781 ```
782 struct Foo;
783
784 impl Foo {
785     fn bar(self) {}
786
787     fn foo(self) {
788         self.bar(); // ok!
789     }
790 }
791 ```
792 "##,
793
794 E0425: r##"
795 An unresolved name was used. Example of erroneous codes:
796
797 ```
798 something_that_doesnt_exist::foo;
799 // error: unresolved name `something_that_doesnt_exist::foo`
800
801 // or:
802 trait Foo {
803     fn bar() {
804         Self; // error: unresolved name `Self`
805     }
806 }
807
808 // or:
809 let x = unknown_variable;  // error: unresolved name `unknown_variable`
810 ```
811
812 Please verify that the name wasn't misspelled and ensure that the
813 identifier being referred to is valid for the given situation. Example:
814
815 ```
816 enum something_that_does_exist {
817     foo
818 }
819
820 // or:
821 mod something_that_does_exist {
822     pub static foo : i32 = 0i32;
823 }
824
825 something_that_does_exist::foo; // ok!
826
827 // or:
828 let unknown_variable = 12u32;
829 let x = unknown_variable; // ok!
830 ```
831 "##,
832
833 E0426: r##"
834 An undeclared label was used. Example of erroneous code:
835
836 ```
837 loop {
838     break 'a; // error: use of undeclared label `'a`
839 }
840 ```
841
842 Please verify you spelt or declare the label correctly. Example:
843
844 ```
845 'a: loop {
846     break 'a; // ok!
847 }
848 ```
849 "##,
850
851 E0428: r##"
852 A type or module has been defined more than once. Example of erroneous
853 code:
854
855 ```
856 struct Bar;
857 struct Bar; // error: duplicate definition of value `Bar`
858 ```
859
860 Please verify you didn't misspell the type/module's name or remove/rename the
861 duplicated one. Example:
862
863 ```
864 struct Bar;
865 struct Bar2; // ok!
866 ```
867 "##,
868
869 E0430: r##"
870 The `self` import appears more than once in the list. Erroneous code example:
871
872 ```
873 use something::{self, self}; // error: `self` import can only appear once in
874                              //        the list
875 ```
876
877 Please verify you didn't misspell the import name or remove the duplicated
878 `self` import. Example:
879
880 ```
881 use something::self; // ok!
882 ```
883 "##,
884
885 E0431: r##"
886 `self` import was made. Erroneous code example:
887
888 ```
889 use {self}; // error: `self` import can only appear in an import list with a
890             //        non-empty prefix
891 ```
892
893 You cannot import the current module into itself, please remove this import
894 or verify you didn't misspell it.
895 "##,
896
897 E0432: r##"
898 An import was unresolved. Erroneous code example:
899
900 ```
901 use something::Foo; // error: unresolved import `something::Foo`.
902 ```
903
904 Please verify you didn't misspell the import name or the import does exist
905 in the module from where you tried to import it. Example:
906
907 ```
908 use something::Foo; // ok!
909
910 mod something {
911     pub struct Foo;
912 }
913 ```
914
915 Or, if you tried to use a module from an external crate, you may have missed
916 the `extern crate` declaration:
917
918 ```
919 extern crate homura; // Required to use the `homura` crate
920
921 use homura::Madoka;
922 ```
923 "##,
924
925 E0433: r##"
926 Invalid import. Example of erroneous code:
927
928 ```
929 use something_which_doesnt_exist;
930 // error: unresolved import `something_which_doesnt_exist`
931 ```
932
933 Please verify you didn't misspell the import's name.
934 "##,
935
936 E0435: r##"
937 A non-constant value was used to initialise a constant. Example of erroneous
938 code:
939
940 ```
941 let foo = 42u32;
942 const FOO : u32 = foo; // error: attempt to use a non-constant value in a
943                        //        constant
944 ```
945
946 To fix this error, please replace the value with a constant. Example:
947
948 ```
949 const FOO : u32 = 42u32; // ok!
950
951 // or:
952 const OTHER_FOO : u32 = 42u32;
953 const FOO : u32 = OTHER_FOO; // ok!
954 ```
955 "##,
956
957 E0437: r##"
958 Trait implementations can only implement associated types that are members of
959 the trait in question. This error indicates that you attempted to implement
960 an associated type whose name does not match the name of any associated type
961 in the trait.
962
963 Here is an example that demonstrates the error:
964
965 ```
966 trait Foo {}
967
968 impl Foo for i32 {
969     type Bar = bool;
970 }
971 ```
972
973 The solution to this problem is to remove the extraneous associated type:
974
975 ```
976 trait Foo {}
977
978 impl Foo for i32 {}
979 ```
980 "##,
981
982 E0438: r##"
983 Trait implementations can only implement associated constants that are
984 members of the trait in question. This error indicates that you
985 attempted to implement an associated constant whose name does not
986 match the name of any associated constant in the trait.
987
988 Here is an example that demonstrates the error:
989
990 ```
991 #![feature(associated_consts)]
992
993 trait Foo {}
994
995 impl Foo for i32 {
996     const BAR: bool = true;
997 }
998 ```
999
1000 The solution to this problem is to remove the extraneous associated constant:
1001
1002 ```
1003 trait Foo {}
1004
1005 impl Foo for i32 {}
1006 ```
1007 "##
1008
1009 }
1010
1011 register_diagnostics! {
1012 //  E0153, unused error code
1013 //  E0157, unused error code
1014     E0254, // import conflicts with imported crate in this module
1015     E0257,
1016     E0258,
1017     E0402, // cannot use an outer type parameter in this context
1018     E0406, // undeclared associated type
1019     E0408, // variable from pattern #1 is not bound in pattern #
1020     E0409, // variable is bound with different mode in pattern # than in
1021            // pattern #1
1022     E0410, // variable from pattern is not bound in pattern 1
1023     E0414, // only irrefutable patterns allowed here
1024     E0418, // is not an enum variant, struct or const
1025     E0420, // is not an associated const
1026     E0421, // unresolved associated const
1027     E0427, // cannot use `ref` binding mode with ...
1028     E0429, // `self` imports are only allowed within a { } list
1029     E0434, // can't capture dynamic environment in a fn item
1030 }