]> git.proxmox.com Git - rustc.git/blob - src/librustc_resolve/diagnostics.rs
Imported Upstream version 1.6.0+dfsg1
[rustc.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 functions 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 Functions inside functions are basically just like top-level functions, except
290 that they can only be called from the function they are in.
291
292 There are a couple of solutions for this.
293
294 You can use a closure:
295
296 ```
297 fn foo<T>(x: T) {
298 let bar = |y: T| { // explicit type annotation may not be necessary
299 // ..
300 }
301 bar(x);
302 }
303 ```
304
305 or copy over the parameters:
306
307 ```
308 fn foo<T>(x: T) {
309 fn bar<T>(y: T) {
310 // ..
311 }
312 bar(x);
313 }
314 ```
315
316 Be sure to copy over any bounds as well:
317
318 ```
319 fn foo<T: Copy>(x: T) {
320 fn bar<T: Copy>(y: T) {
321 // ..
322 }
323 bar(x);
324 }
325 ```
326
327 This may require additional type hints in the function body.
328
329 In case the function is in an `impl`, defining a private helper function might
330 be easier:
331
332 ```
333 impl<T> Foo<T> {
334 pub fn foo(&self, x: T) {
335 self.bar(x);
336 }
337 fn bar(&self, y: T) {
338 // ..
339 }
340 }
341 ```
342
343 For default impls in traits, the private helper solution won't work, however
344 closures or copying the parameters should still work.
345 "##,
346
347 E0403: r##"
348 Some type parameters have the same name. Example of erroneous code:
349
350 ```
351 fn foo<T, T>(s: T, u: T) {} // error: the name `T` is already used for a type
352 // parameter in this type parameter list
353 ```
354
355 Please verify that none of the type parameterss are misspelled, and rename any
356 clashing parameters. Example:
357
358 ```
359 fn foo<T, Y>(s: T, u: Y) {} // ok!
360 ```
361 "##,
362
363 E0404: r##"
364 You tried to implement something which was not a trait on an object. Example of
365 erroneous code:
366
367 ```
368 struct Foo;
369 struct Bar;
370
371 impl Foo for Bar {} // error: `Foo` is not a trait
372 ```
373
374 Please verify that you didn't misspell the trait's name or otherwise use the
375 wrong identifier. Example:
376
377 ```
378 trait Foo {
379 // some functions
380 }
381 struct Bar;
382
383 impl Foo for Bar { // ok!
384 // functions implementation
385 }
386 ```
387 "##,
388
389 E0405: r##"
390 An unknown trait was implemented. Example of erroneous code:
391
392 ```
393 struct Foo;
394
395 impl SomeTrait for Foo {} // error: use of undeclared trait name `SomeTrait`
396 ```
397
398 Please verify that the name of the trait wasn't misspelled and ensure that it
399 was imported. Example:
400
401 ```
402 // solution 1:
403 use some_file::SomeTrait;
404
405 // solution 2:
406 trait SomeTrait {
407 // some functions
408 }
409
410 struct Foo;
411
412 impl SomeTrait for Foo { // ok!
413 // implements functions
414 }
415 ```
416 "##,
417
418 E0407: r##"
419 A definition of a method not in the implemented trait was given in a trait
420 implementation. Example of erroneous code:
421
422 ```
423 trait Foo {
424 fn a();
425 }
426
427 struct Bar;
428
429 impl Foo for Bar {
430 fn a() {}
431 fn b() {} // error: method `b` is not a member of trait `Foo`
432 }
433 ```
434
435 Please verify you didn't misspell the method name and you used the correct
436 trait. First example:
437
438 ```
439 trait Foo {
440 fn a();
441 fn b();
442 }
443
444 struct Bar;
445
446 impl Foo for Bar {
447 fn a() {}
448 fn b() {} // ok!
449 }
450 ```
451
452 Second example:
453
454 ```
455 trait Foo {
456 fn a();
457 }
458
459 struct Bar;
460
461 impl Foo for Bar {
462 fn a() {}
463 }
464
465 impl Bar {
466 fn b() {}
467 }
468 ```
469 "##,
470
471 E0411: r##"
472 The `Self` keyword was used outside an impl or a trait. Erroneous
473 code example:
474
475 ```
476 <Self>::foo; // error: use of `Self` outside of an impl or trait
477 ```
478
479 The `Self` keyword represents the current type, which explains why it
480 can only be used inside an impl or a trait. It gives access to the
481 associated items of a type:
482
483 ```
484 trait Foo {
485 type Bar;
486 }
487
488 trait Baz : Foo {
489 fn bar() -> Self::Bar; // like this
490 }
491 ```
492
493 However, be careful when two types has a common associated type:
494
495 ```
496 trait Foo {
497 type Bar;
498 }
499
500 trait Foo2 {
501 type Bar;
502 }
503
504 trait Baz : Foo + Foo2 {
505 fn bar() -> Self::Bar;
506 // error: ambiguous associated type `Bar` in bounds of `Self`
507 }
508 ```
509
510 This problem can be solved by specifying from which trait we want
511 to use the `Bar` type:
512
513 ```
514 trait Baz : Foo + Foo2 {
515 fn bar() -> <Self as Foo>::Bar; // ok!
516 }
517 ```
518 "##,
519
520 E0412: r##"
521 An undeclared type name was used. Example of erroneous codes:
522
523 ```
524 impl Something {} // error: use of undeclared type name `Something`
525 // or:
526 trait Foo {
527 fn bar(N); // error: use of undeclared type name `N`
528 }
529 // or:
530 fn foo(x: T) {} // error: use of undeclared type name `T`
531 ```
532
533 To fix this error, please verify you didn't misspell the type name,
534 you did declare it or imported it into the scope. Examples:
535
536 ```
537 struct Something;
538
539 impl Something {} // ok!
540 // or:
541 trait Foo {
542 type N;
543
544 fn bar(Self::N); // ok!
545 }
546 //or:
547 fn foo<T>(x: T) {} // ok!
548 ```
549 "##,
550
551 E0413: r##"
552 A declaration shadows an enum variant or unit-like struct in scope.
553 Example of erroneous code:
554
555 ```
556 struct Foo;
557
558 let Foo = 12i32; // error: declaration of `Foo` shadows an enum variant or
559 // unit-like struct in scope
560 ```
561
562
563 To fix this error, rename the variable such that it doesn't shadow any enum
564 variable or structure in scope. Example:
565
566 ```
567 struct Foo;
568
569 let foo = 12i32; // ok!
570 ```
571
572 Or:
573
574 ```
575 struct FooStruct;
576
577 let Foo = 12i32; // ok!
578 ```
579
580 The goal here is to avoid a conflict of names.
581 "##,
582
583 E0415: r##"
584 More than one function parameter have the same name. Example of erroneous
585 code:
586
587 ```
588 fn foo(f: i32, f: i32) {} // error: identifier `f` is bound more than
589 // once in this parameter list
590 ```
591
592 Please verify you didn't misspell parameters' name. Example:
593
594 ```
595 fn foo(f: i32, g: i32) {} // ok!
596 ```
597 "##,
598
599 E0416: r##"
600 An identifier is bound more than once in a pattern. Example of erroneous
601 code:
602
603 ```
604 match (1, 2) {
605 (x, x) => {} // error: identifier `x` is bound more than once in the
606 // same pattern
607 }
608 ```
609
610 Please verify you didn't misspell identifiers' name. Example:
611
612 ```
613 match (1, 2) {
614 (x, y) => {} // ok!
615 }
616 ```
617
618 Or maybe did you mean to unify? Consider using a guard:
619
620 ```
621 match (A, B, C) {
622 (x, x2, see) if x == x2 => { /* A and B are equal, do one thing */ }
623 (y, z, see) => { /* A and B unequal; do another thing */ }
624 }
625 ```
626 "##,
627
628 E0417: r##"
629 A static variable was referenced in a pattern. Example of erroneous code:
630
631 ```
632 static FOO : i32 = 0;
633
634 match 0 {
635 FOO => {} // error: static variables cannot be referenced in a
636 // pattern, use a `const` instead
637 _ => {}
638 }
639 ```
640
641 The compiler needs to know the value of the pattern at compile time;
642 compile-time patterns can defined via const or enum items. Please verify
643 that the identifier is spelled correctly, and if so, use a const instead
644 of static to define it. Example:
645
646 ```
647 const FOO : i32 = 0;
648
649 match 0 {
650 FOO => {} // ok!
651 _ => {}
652 }
653 ```
654 "##,
655
656 E0419: r##"
657 An unknown enum variant, struct or const was used. Example of
658 erroneous code:
659
660 ```
661 match 0 {
662 Something::Foo => {} // error: unresolved enum variant, struct
663 // or const `Foo`
664 }
665 ```
666
667 Please verify you didn't misspell it and the enum variant, struct or const has
668 been declared and imported into scope. Example:
669
670 ```
671 enum Something {
672 Foo,
673 NotFoo,
674 }
675
676 match Something::NotFoo {
677 Something::Foo => {} // ok!
678 _ => {}
679 }
680 ```
681 "##,
682
683 E0422: r##"
684 You are trying to use an identifier that is either undefined or not a
685 struct. For instance:
686 ```
687 fn main () {
688 let x = Foo { x: 1, y: 2 };
689 }
690 ```
691
692 In this case, `Foo` is undefined, so it inherently isn't anything, and
693 definitely not a struct.
694
695 ```
696 fn main () {
697 let foo = 1;
698 let x = foo { x: 1, y: 2 };
699 }
700 ```
701
702 In this case, `foo` is defined, but is not a struct, so Rust can't use
703 it as one.
704 "##,
705
706 E0423: r##"
707 A `struct` variant name was used like a function name. Example of
708 erroneous code:
709
710 ```
711 struct Foo { a: bool};
712
713 let f = Foo();
714 // error: `Foo` is a struct variant name, but this expression uses
715 // it like a function name
716 ```
717
718 Please verify you didn't misspell the name of what you actually wanted
719 to use here. Example:
720
721 ```
722 fn Foo() -> u32 { 0 }
723
724 let f = Foo(); // ok!
725 ```
726 "##,
727
728 E0424: r##"
729 The `self` keyword was used in a static method. Example of erroneous code:
730
731 ```
732 struct Foo;
733
734 impl Foo {
735 fn bar(self) {}
736
737 fn foo() {
738 self.bar(); // error: `self` is not available in a static method.
739 }
740 }
741 ```
742
743 Please check if the method's argument list should have contained `self`,
744 `&self`, or `&mut self` (in case you didn't want to create a static
745 method), and add it if so. Example:
746
747 ```
748 struct Foo;
749
750 impl Foo {
751 fn bar(self) {}
752
753 fn foo(self) {
754 self.bar(); // ok!
755 }
756 }
757 ```
758 "##,
759
760 E0425: r##"
761 An unresolved name was used. Example of erroneous codes:
762
763 ```
764 something_that_doesnt_exist::foo;
765 // error: unresolved name `something_that_doesnt_exist::foo`
766
767 // or:
768 trait Foo {
769 fn bar() {
770 Self; // error: unresolved name `Self`
771 }
772 }
773
774 // or:
775 let x = unknown_variable; // error: unresolved name `unknown_variable`
776 ```
777
778 Please verify that the name wasn't misspelled and ensure that the
779 identifier being referred to is valid for the given situation. Example:
780
781 ```
782 enum something_that_does_exist {
783 foo
784 }
785
786 // or:
787 mod something_that_does_exist {
788 pub static foo : i32 = 0i32;
789 }
790
791 something_that_does_exist::foo; // ok!
792
793 // or:
794 let unknown_variable = 12u32;
795 let x = unknown_variable; // ok!
796 ```
797 "##,
798
799 E0426: r##"
800 An undeclared label was used. Example of erroneous code:
801
802 ```
803 loop {
804 break 'a; // error: use of undeclared label `'a`
805 }
806 ```
807
808 Please verify you spelt or declare the label correctly. Example:
809
810 ```
811 'a: loop {
812 break 'a; // ok!
813 }
814 ```
815 "##,
816
817 E0428: r##"
818 A type or module has been defined more than once. Example of erroneous
819 code:
820
821 ```
822 struct Bar;
823 struct Bar; // error: duplicate definition of value `Bar`
824 ```
825
826 Please verify you didn't misspell the type/module's name or remove/rename the
827 duplicated one. Example:
828
829 ```
830 struct Bar;
831 struct Bar2; // ok!
832 ```
833 "##,
834
835 E0430: r##"
836 The `self` import appears more than once in the list. Erroneous code example:
837
838 ```
839 use something::{self, self}; // error: `self` import can only appear once in
840 // the list
841 ```
842
843 Please verify you didn't misspell the import name or remove the duplicated
844 `self` import. Example:
845
846 ```
847 use something::self; // ok!
848 ```
849 "##,
850
851 E0431: r##"
852 `self` import was made. Erroneous code example:
853
854 ```
855 use {self}; // error: `self` import can only appear in an import list with a
856 // non-empty prefix
857 ```
858
859 You cannot import the current module into itself, please remove this import
860 or verify you didn't misspell it.
861 "##,
862
863 E0432: r##"
864 An import was unresolved. Erroneous code example:
865
866 ```
867 use something::Foo; // error: unresolved import `something::Foo`.
868 ```
869
870 Please verify you didn't misspell the import name or the import does exist
871 in the module from where you tried to import it. Example:
872
873 ```
874 use something::Foo; // ok!
875
876 mod something {
877 pub struct Foo;
878 }
879 ```
880
881 Or, if you tried to use a module from an external crate, you may have missed
882 the `extern crate` declaration:
883
884 ```
885 extern crate homura; // Required to use the `homura` crate
886
887 use homura::Madoka;
888 ```
889 "##,
890
891 E0433: r##"
892 Invalid import. Example of erroneous code:
893
894 ```
895 use something_which_doesnt_exist;
896 // error: unresolved import `something_which_doesnt_exist`
897 ```
898
899 Please verify you didn't misspell the import's name.
900 "##,
901
902 E0435: r##"
903 A non-constant value was used to initialise a constant. Example of erroneous
904 code:
905
906 ```
907 let foo = 42u32;
908 const FOO : u32 = foo; // error: attempt to use a non-constant value in a
909 // constant
910 ```
911
912 To fix this error, please replace the value with a constant. Example:
913
914 ```
915 const FOO : u32 = 42u32; // ok!
916
917 // or:
918 const OTHER_FOO : u32 = 42u32;
919 const FOO : u32 = OTHER_FOO; // ok!
920 ```
921 "##,
922
923 E0437: r##"
924 Trait implementations can only implement associated types that are members of
925 the trait in question. This error indicates that you attempted to implement
926 an associated type whose name does not match the name of any associated type
927 in the trait.
928
929 Here is an example that demonstrates the error:
930
931 ```
932 trait Foo {}
933
934 impl Foo for i32 {
935 type Bar = bool;
936 }
937 ```
938
939 The solution to this problem is to remove the extraneous associated type:
940
941 ```
942 trait Foo {}
943
944 impl Foo for i32 {}
945 ```
946 "##,
947
948 E0438: r##"
949 Trait implementations can only implement associated constants that are
950 members of the trait in question. This error indicates that you
951 attempted to implement an associated constant whose name does not
952 match the name of any associated constant in the trait.
953
954 Here is an example that demonstrates the error:
955
956 ```
957 #![feature(associated_consts)]
958
959 trait Foo {}
960
961 impl Foo for i32 {
962 const BAR: bool = true;
963 }
964 ```
965
966 The solution to this problem is to remove the extraneous associated constant:
967
968 ```
969 trait Foo {}
970
971 impl Foo for i32 {}
972 ```
973 "##
974
975 }
976
977 register_diagnostics! {
978 // E0153, unused error code
979 // E0157, unused error code
980 E0254, // import conflicts with imported crate in this module
981 E0257,
982 E0258,
983 E0402, // cannot use an outer type parameter in this context
984 E0406, // undeclared associated type
985 E0408, // variable from pattern #1 is not bound in pattern #
986 E0409, // variable is bound with different mode in pattern # than in
987 // pattern #1
988 E0410, // variable from pattern is not bound in pattern 1
989 E0414, // only irrefutable patterns allowed here
990 E0418, // is not an enum variant, struct or const
991 E0420, // is not an associated const
992 E0421, // unresolved associated const
993 E0427, // cannot use `ref` binding mode with ...
994 E0429, // `self` imports are only allowed within a { } list
995 E0434, // can't capture dynamic environment in a fn item
996 }