]> git.lizzy.rs Git - rust.git/blob - src/librustc_typeck/diagnostics.rs
Add diagnostic messages for E0074-E0077
[rust.git] / src / librustc_typeck / 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 register_long_diagnostics! {
14
15 E0023: r##"
16 A pattern used to match against an enum variant must provide a sub-pattern for
17 each field of the enum variant. This error indicates that a pattern attempted to
18 extract an incorrect number of fields from a variant.
19
20 ```
21 enum Fruit {
22     Apple(String, String)
23     Pear(u32)
24 }
25 ```
26
27 Here the `Apple` variant has two fields, and should be matched against like so:
28
29 ```
30 // Correct.
31 match x {
32     Apple(a, b) => ...
33 }
34 ```
35
36 Matching with the wrong number of fields has no sensible interpretation:
37
38 ```
39 // Incorrect.
40 match x {
41     Apple(a) => ...,
42     Apple(a, b, c) => ...
43 }
44 ```
45
46 Check how many fields the enum was declared with and ensure that your pattern
47 uses the same number.
48 "##,
49
50 E0024: r##"
51 This error indicates that a pattern attempted to extract the fields of an enum
52 variant with no fields. Here's a tiny example of this error:
53
54 ```
55 // This enum has two variants.
56 enum Number {
57     // This variant has no fields.
58     Zero,
59     // This variant has one field.
60     One(u32)
61 }
62
63 // Assuming x is a Number we can pattern match on its contents.
64 match x {
65     Zero(inside) => ...,
66     One(inside) => ...
67 }
68 ```
69
70 The pattern match `Zero(inside)` is incorrect because the `Zero` variant
71 contains no fields, yet the `inside` name attempts to bind the first field of
72 the enum.
73 "##,
74
75 E0025: r##"
76 Each field of a struct can only be bound once in a pattern. Each occurrence of a
77 field name binds the value of that field, so to fix this error you will have to
78 remove or alter the duplicate uses of the field name. Perhaps you misspelt
79 another field name?
80 "##,
81
82 E0026: r##"
83 This error indicates that a struct pattern attempted to extract a non-existant
84 field from a struct. Struct fields are identified by the name used before the
85 colon `:` so struct patterns should resemble the declaration of the struct type
86 being matched.
87
88 ```
89 // Correct matching.
90 struct Thing {
91     x: u32,
92     y: u32
93 }
94
95 let thing = Thing { x: 1, y: 2 };
96 match thing {
97     Thing { x: xfield, y: yfield } => ...
98 }
99 ```
100
101 If you are using shorthand field patterns but want to refer to the struct field
102 by a different name, you should rename it explicitly.
103
104 ```
105 // Change this:
106 match thing {
107     Thing { x, z } => ...
108 }
109
110 // To this:
111 match thing {
112     Thing { x, y: z } => ...
113 }
114 ```
115 "##,
116
117 E0027: r##"
118 This error indicates that a pattern for a struct fails to specify a sub-pattern
119 for every one of the struct's fields. Ensure that each field from the struct's
120 definition is mentioned in the pattern, or use `..` to ignore unwanted fields.
121
122 For example:
123
124 ```
125 struct Dog {
126     name: String,
127     age: u32
128 }
129
130 let d = Dog { name: "Rusty".to_string(), age: 8 };
131
132 // This is incorrect.
133 match d {
134     Dog { age: x } => ...
135 }
136
137 // This is correct (explicit).
138 match d {
139     Dog { name: n, age: x } => ...
140 }
141
142 // This is also correct (ignore unused fields).
143 match d {
144     Dog { age: x, .. } => ...
145 }
146 ```
147 "##,
148
149 E0029: r##"
150 In a match expression, only numbers and characters can be matched against a
151 range. This is because the compiler checks that the range is non-empty at
152 compile-time, and is unable to evaluate arbitrary comparison functions. If you
153 want to capture values of an orderable type between two end-points, you can use
154 a guard.
155
156 ```
157 // The ordering relation for strings can't be evaluated at compile time,
158 // so this doesn't work:
159 match string {
160     "hello" ... "world" => ...
161     _ => ...
162 }
163
164 // This is a more general version, using a guard:
165 match string {
166     s if s >= "hello" && s <= "world" => ...
167     _ => ...
168 }
169 ```
170 "##,
171
172 E0033: r##"
173 This error indicates that a pointer to a trait type cannot be implicitly
174 dereferenced by a pattern. Every trait defines a type, but because the
175 size of trait implementors isn't fixed, this type has no compile-time size.
176 Therefore, all accesses to trait types must be through pointers. If you
177 encounter this error you should try to avoid dereferencing the pointer.
178
179 ```
180 let trait_obj: &SomeTrait = ...;
181
182 // This tries to implicitly dereference to create an unsized local variable.
183 let &invalid = trait_obj;
184
185 // You can call methods without binding to the value being pointed at.
186 trait_obj.method_one();
187 trait_obj.method_two();
188 ```
189
190 You can read more about trait objects in the Trait Object section of the
191 Reference:
192
193 http://doc.rust-lang.org/reference.html#trait-objects
194 "##,
195
196 E0034: r##"
197 The compiler doesn't know what method to call because more than one method
198 has the same prototype. Example:
199
200 ```
201 struct Test;
202
203 trait Trait1 {
204     fn foo();
205 }
206
207 trait Trait2 {
208     fn foo();
209 }
210
211 impl Trait1 for Test { fn foo() {} }
212 impl Trait2 for Test { fn foo() {} }
213
214 fn main() {
215     Test::foo() // error, which foo() to call?
216 }
217 ```
218
219 To avoid this error, you have to keep only one of them and remove the others.
220 So let's take our example and fix it:
221
222 ```
223 struct Test;
224
225 trait Trait1 {
226     fn foo();
227 }
228
229 impl Trait1 for Test { fn foo() {} }
230
231 fn main() {
232     Test::foo() // and now that's good!
233 }
234 ```
235
236 However, a better solution would be using fully explicit naming of type and
237 trait:
238
239 ```
240 struct Test;
241
242 trait Trait1 {
243     fn foo();
244 }
245
246 trait Trait2 {
247     fn foo();
248 }
249
250 impl Trait1 for Test { fn foo() {} }
251 impl Trait2 for Test { fn foo() {} }
252
253 fn main() {
254     <Test as Trait1>::foo()
255 }
256 ```
257 "##,
258
259 E0035: r##"
260 You tried to give a type parameter where it wasn't needed. Bad example:
261
262 ```
263 struct Test;
264
265 impl Test {
266     fn method(&self) {}
267 }
268
269 fn main() {
270     let x = Test;
271
272     x.method::<i32>(); // Error: Test::method doesn't need type parameter!
273 }
274 ```
275
276 To fix this error, just remove the type parameter:
277
278 ```
279 struct Test;
280
281 impl Test {
282     fn method(&self) {}
283 }
284
285 fn main() {
286     let x = Test;
287
288     x.method(); // OK, we're good!
289 }
290 ```
291 "##,
292
293 E0036: r##"
294 This error occurrs when you pass too many or not enough type parameters to
295 a method. Example:
296
297 ```
298 struct Test;
299
300 impl Test {
301     fn method<T>(&self, v: &[T]) -> usize {
302         v.len()
303     }
304 }
305
306 fn main() {
307     let x = Test;
308     let v = &[0i32];
309
310     x.method::<i32, i32>(v); // error: only one type parameter is expected!
311 }
312 ```
313
314 To fix it, just specify a correct number of type parameters:
315
316 ```
317 struct Test;
318
319 impl Test {
320     fn method<T>(&self, v: &[T]) -> usize {
321         v.len()
322     }
323 }
324
325 fn main() {
326     let x = Test;
327     let v = &[0i32];
328
329     x.method::<i32>(v); // OK, we're good!
330 }
331 ```
332
333 Please note on the last example that we could have called `method` like this:
334
335 ```
336 x.method(v);
337 ```
338 "##,
339
340 E0040: r##"
341 It is not allowed to manually call destructors in Rust. It is also not
342 necessary to do this since `drop` is called automatically whenever a value goes
343 out of scope.
344
345 Here's an example of this error:
346
347 ```
348 struct Foo {
349     x: i32,
350 }
351
352 impl Drop for Foo {
353     fn drop(&mut self) {
354         println!("kaboom");
355     }
356 }
357
358 fn main() {
359     let mut x = Foo { x: -7 };
360     x.drop(); // error: explicit use of destructor method
361 }
362 ```
363 "##,
364
365 E0044: r##"
366 You can't use type parameters on foreign items. Example of erroneous code:
367
368 ```
369 extern { fn some_func<T>(x: T); }
370 ```
371
372 To fix this, replace the type parameter with the specializations that you
373 need:
374
375 ```
376 extern { fn some_func_i32(x: i32); }
377 extern { fn some_func_i64(x: i64); }
378 ```
379 "##,
380
381 E0045: r##"
382 Rust only supports variadic parameters for interoperability with C code in its
383 FFI. As such, variadic parameters can only be used with functions which are
384 using the C ABI. Examples of erroneous code:
385
386 ```
387 extern "rust-call" { fn foo(x: u8, ...); }
388 // or
389 fn foo(x: u8, ...) {}
390 ```
391
392 To fix such code, put them in an extern "C" block:
393
394 ```
395 extern "C" fn foo (x: u8, ...);
396 // or:
397 extern "C" {
398     fn foo (x: u8, ...);
399 }
400 ```
401 "##,
402
403 E0046: r##"
404 When trying to make some type implement a trait `Foo`, you must, at minimum,
405 provide implementations for all of `Foo`'s required methods (meaning the
406 methods that do not have default implementations), as well as any required
407 trait items like associated types or constants.
408 "##,
409
410 E0049: r##"
411 This error indicates that an attempted implementation of a trait method
412 has the wrong number of type parameters.
413
414 For example, the trait below has a method `foo` with a type parameter `T`,
415 but the implementation of `foo` for the type `Bar` is missing this parameter:
416
417 ```
418 trait Foo {
419     fn foo<T: Default>(x: T) -> Self;
420 }
421
422 struct Bar;
423
424 // error: method `foo` has 0 type parameters but its trait declaration has 1
425 // type parameter
426 impl Foo for Bar {
427     fn foo(x: bool) -> Self { Bar }
428 }
429 ```
430 "##,
431
432 E0050: r##"
433 This error indicates that an attempted implementation of a trait method
434 has the wrong number of function parameters.
435
436 For example, the trait below has a method `foo` with two function parameters
437 (`&self` and `u8`), but the implementation of `foo` for the type `Bar` omits
438 the `u8` parameter:
439
440 ```
441 trait Foo {
442     fn foo(&self, x: u8) -> bool;
443 }
444
445 struct Bar;
446
447 // error: method `foo` has 1 parameter but the declaration in trait `Foo::foo`
448 // has 2
449 impl Foo for Bar {
450     fn foo(&self) -> bool { true }
451 }
452 ```
453 "##,
454
455 E0053: r##"
456 The parameters of any trait method must match between a trait implementation
457 and the trait definition.
458
459 Here are a couple examples of this error:
460
461 ```
462 trait Foo {
463     fn foo(x: u16);
464     fn bar(&self);
465 }
466
467 struct Bar;
468
469 impl Foo for Bar {
470     // error, expected u16, found i16
471     fn foo(x: i16) { }
472
473     // error, values differ in mutability
474     fn bar(&mut self) { }
475 }
476 ```
477 "##,
478
479 E0054: r##"
480 It is not allowed to cast to a bool. If you are trying to cast a numeric type
481 to a bool, you can compare it with zero instead:
482
483 ```
484 let x = 5;
485
486 // Ok
487 let x_is_nonzero = x != 0;
488
489 // Not allowed, won't compile
490 let x_is_nonzero = x as bool;
491 ```
492 "##,
493
494 E0055: r##"
495 During a method call, a value is automatically dereferenced as many times as
496 needed to make the value's type match the method's receiver. The catch is that
497 the compiler will only attempt to dereference a number of times up to the
498 recursion limit (which can be set via the `recursion_limit` attribute).
499
500 For a somewhat artificial example:
501
502 ```
503 #![recursion_limit="2"]
504
505 struct Foo;
506
507 impl Foo {
508     fn foo(&self) {}
509 }
510
511 fn main() {
512     let foo = Foo;
513     let ref_foo = &&Foo;
514
515     // error, reached the recursion limit while auto-dereferencing &&Foo
516     ref_foo.foo();
517 }
518 ```
519
520 One fix may be to increase the recursion limit. Note that it is possible to
521 create an infinite recursion of dereferencing, in which case the only fix is to
522 somehow break the recursion.
523 "##,
524
525 E0057: r##"
526 When invoking closures or other implementations of the function traits `Fn`,
527 `FnMut` or `FnOnce` using call notation, the number of parameters passed to the
528 function must match its definition.
529
530 An example using a closure:
531
532 ```
533 let f = |x| x * 3;
534 let a = f();        // invalid, too few parameters
535 let b = f(4);       // this works!
536 let c = f(2, 3);    // invalid, too many parameters
537 ```
538
539 A generic function must be treated similarly:
540
541 ```
542 fn foo<F: Fn()>(f: F) {
543     f(); // this is valid, but f(3) would not work
544 }
545 ```
546 "##,
547
548 E0059: r##"
549 The built-in function traits are generic over a tuple of the function arguments.
550 If one uses angle-bracket notation (`Fn<(T,), Output=U>`) instead of parentheses
551 (`Fn(T) -> U`) to denote the function trait, the type parameter should be a
552 tuple. Otherwise function call notation cannot be used and the trait will not be
553 implemented by closures.
554
555 The most likely source of this error is using angle-bracket notation without
556 wrapping the function argument type into a tuple, for example:
557
558 ```
559 fn foo<F: Fn<i32>>(f: F) -> F::Output { f(3) }
560 ```
561
562 It can be fixed by adjusting the trait bound like this:
563
564 ```
565 fn foo<F: Fn<(i32,)>>(f: F) -> F::Output { f(3) }
566 ```
567
568 Note that `(T,)` always denotes the type of a 1-tuple containing an element of
569 type `T`. The comma is necessary for syntactic disambiguation.
570 "##,
571
572 E0060: r##"
573 External C functions are allowed to be variadic. However, a variadic function
574 takes a minimum number of arguments. For example, consider C's variadic `printf`
575 function:
576
577 ```
578 extern crate libc;
579 use libc::{ c_char, c_int };
580
581 extern "C" {
582     fn printf(_: *const c_char, ...) -> c_int;
583 }
584 ```
585
586 Using this declaration, it must be called with at least one argument, so
587 simply calling `printf()` is invalid. But the following uses are allowed:
588
589 ```
590 unsafe {
591     use std::ffi::CString;
592
593     printf(CString::new("test\n").unwrap().as_ptr());
594     printf(CString::new("number = %d\n").unwrap().as_ptr(), 3);
595     printf(CString::new("%d, %d\n").unwrap().as_ptr(), 10, 5);
596 }
597 ```
598 "##,
599
600 E0061: r##"
601 The number of arguments passed to a function must match the number of arguments
602 specified in the function signature.
603
604 For example, a function like
605
606 ```
607 fn f(a: u16, b: &str) {}
608 ```
609
610 must always be called with exactly two arguments, e.g. `f(2, "test")`.
611
612 Note, that Rust does not have a notion of optional function arguments or
613 variadic functions (except for its C-FFI).
614 "##,
615
616 E0062: r##"
617 This error indicates that during an attempt to build a struct or struct-like
618 enum variant, one of the fields was specified more than once. Each field should
619 be specified exactly one time.
620 "##,
621
622 E0063: r##"
623 This error indicates that during an attempt to build a struct or struct-like
624 enum variant, one of the fields was not provided. Each field should be
625 specified exactly once.
626 "##,
627
628 E0066: r##"
629 Box placement expressions (like C++'s "placement new") do not yet support any
630 place expression except the exchange heap (i.e. `std::boxed::HEAP`).
631 Furthermore, the syntax is changing to use `in` instead of `box`. See [RFC 470]
632 and [RFC 809] for more details.
633
634 [RFC 470]: https://github.com/rust-lang/rfcs/pull/470
635 [RFC 809]: https://github.com/rust-lang/rfcs/pull/809
636 "##,
637
638 E0067: r##"
639 The left-hand side of a compound assignment expression must be an lvalue
640 expression. An lvalue expression represents a memory location and includes
641 item paths (ie, namespaced variables), dereferences, indexing expressions,
642 and field references.
643
644 Let's start with some bad examples:
645 ```
646 use std::collections::LinkedList;
647
648 // Bad: assignment to non-lvalue expression
649 LinkedList::new() += 1;
650
651 // ...
652
653 fn some_func(i: &mut i32) {
654     i += 12; // Error : '+=' operation cannot be applied on a reference !
655 }
656
657 And now some good examples:
658 ```
659 let mut i : i32 = 0;
660
661 i += 12; // Good !
662
663 // ...
664
665 fn some_func(i: &mut i32) {
666     *i += 12; // Good !
667 }
668
669 ```
670 "##,
671
672 E0069: r##"
673 The compiler found a function whose body contains a `return;` statement but
674 whose return type is not `()`. An example of this is:
675
676 ```
677 // error
678 fn foo() -> u8 {
679     return;
680 }
681 ```
682
683 Since `return;` is just like `return ();`, there is a mismatch between the
684 function's return type and the value being returned.
685 "##,
686
687 E0070: r##"
688 The left-hand side of an assignment operator must be an lvalue expression. An
689 lvalue expression represents a memory location and can be a variable (with
690 optional namespacing), a dereference, an indexing expression or a field
691 reference.
692
693 More details can be found here:
694 https://doc.rust-lang.org/reference.html#lvalues,-rvalues-and-temporaries
695
696 Now, we can go further. Here are some bad examples:
697 ```
698 struct SomeStruct {
699     x: i32,
700     y: i32
701 }
702 const SOME_CONST : i32 = 12;
703
704 fn some_other_func() {}
705
706 fn some_function() {
707     SOME_CONST = 14; // error : a constant value cannot be changed!
708     1 = 3; // error : 1 isn't a valid lvalue!
709     some_other_func() = 4; // error : we can't assign value to a function!
710     SomeStruct.x = 12; // error : SomeStruct a structure name but it is used
711                        // like a variable!
712 }
713 ```
714
715 And now let's give good examples:
716
717 ```
718 struct SomeStruct {
719     x: i32,
720     y: i32
721 }
722 let mut s = SomeStruct {x: 0, y: 0};
723
724 s.x = 3; // that's good !
725
726 // ...
727
728 fn some_func(x: &mut i32) {
729     *x = 12; // that's good !
730 }
731 ```
732 "##,
733
734 E0071: r##"
735 You tried to use a structure initialization with a non-structure type.
736 Example of erroneous code:
737
738 ```
739 enum Foo { FirstValue };
740
741 let u = Foo::FirstValue { value: 0i32 }; // error: Foo::FirstValue
742                                          // isn't a structure!
743 // or even simpler, if the structure wasn't defined at all:
744 let u = RandomName { random_field: 0i32 }; // error: RandomName
745                                            // isn't a structure!
746 ```
747
748 To fix this, please check:
749  * Did you spell it right?
750  * Did you accidentaly used an enum as a struct?
751  * Did you accidentaly make an enum when you intended to use a struct?
752
753 Here is the previous code with all missing information:
754
755 ```
756 struct Inner {
757     value: i32
758 }
759
760 enum Foo {
761     FirstValue(Inner)
762 }
763
764 fn main() {
765     let u = Foo::FirstValue(Inner { value: 0i32 });
766
767     let t = Inner { value: 0i32 };
768 }
769 ```
770 "##,
771
772 E0072: r##"
773 When defining a recursive struct or enum, any use of the type being defined
774 from inside the definition must occur behind a pointer (like `Box` or `&`).
775 This is because structs and enums must have a well-defined size, and without
776 the pointer the size of the type would need to be unbounded.
777
778 Consider the following erroneous definition of a type for a list of bytes:
779
780 ```
781 // error, invalid recursive struct type
782 struct ListNode {
783     head: u8,
784     tail: Option<ListNode>,
785 }
786 ```
787
788 This type cannot have a well-defined size, because it needs to be arbitrarily
789 large (since we would be able to nest `ListNode`s to any depth). Specifically,
790
791 ```plain
792 size of `ListNode` = 1 byte for `head`
793                    + 1 byte for the discriminant of the `Option`
794                    + size of `ListNode`
795 ```
796
797 One way to fix this is by wrapping `ListNode` in a `Box`, like so:
798
799 ```
800 struct ListNode {
801     head: u8,
802     tail: Option<Box<ListNode>>,
803 }
804 ```
805
806 This works because `Box` is a pointer, so its size is well-known.
807 "##,
808
809 E0073: r##"
810 You cannot define a struct (or enum) `Foo` that requires an instance of `Foo`
811 in order to make a new `Foo` value. This is because there would be no way a
812 first instance of `Foo` could be made to initialize another instance!
813
814 Here's an example of a struct that has this problem:
815
816 ```
817 struct Foo { x: Box<Foo> } // error
818 ```
819
820 One fix is to use `Option`, like so:
821
822 ```
823 struct Foo { x: Option<Box<Foo>> }
824 ```
825
826 Now it's possible to create at least one instance of `Foo`: `Foo { x: None }`.
827 "##,
828
829 E0074: r##"
830 When using the `#[simd]` attribute on a tuple struct, the components of the
831 tuple struct must all be of a concrete, nongeneric type so the compiler can
832 reason about how to use SIMD with them. This error will occur if the types
833 are generic.
834
835 ```
836 #[simd]
837 struct Bad<T>(T, T, T); // This will cause an error
838
839 #[simd]
840 struct Good(u32, u32, u32); // This will not
841 ```
842 "##,
843
844 E0075: r##"
845 The `#[simd]` attribute can only be applied to non empty tuple structs, because
846 it doesn't make sense to try to use SIMD operations when there are no values to
847 operate on.
848
849 ```
850 #[simd]
851 struct Bad; // This will cause an error
852
853 #[simd]
854 struct Good(u32); // This will not
855 ```
856 "##,
857
858 E0076: r##"
859 When using the `#[simd]` attribute to automatically use SIMD operations in tuple
860 struct, the types in the struct must all be of the same type, or the compiler
861 will trigger this error.
862
863 ```
864 #[simd]
865 struct Bad(u16, u32, u32); // This will cause an error
866
867 #[simd]
868 struct Good(u32, u32, u32); // This will not
869 ```
870
871 "##,
872
873 E0077: r##"
874 When using the `#[simd]` attribute on a tuple struct, the elements in the tuple
875 must be machine types so SIMD operations can be applied to them.
876
877 ```
878 #[simd]
879 struct Bad(String); // This will cause an error
880
881 #[simd]
882 struct Good(u32, u32, u32); // This will not
883 ```
884 "##,
885
886 E0081: r##"
887 Enum discriminants are used to differentiate enum variants stored in memory.
888 This error indicates that the same value was used for two or more variants,
889 making them impossible to tell apart.
890
891 ```
892 // Good.
893 enum Enum {
894     P,
895     X = 3,
896     Y = 5
897 }
898
899 // Bad.
900 enum Enum {
901     P = 3,
902     X = 3,
903     Y = 5
904 }
905 ```
906
907 Note that variants without a manually specified discriminant are numbered from
908 top to bottom starting from 0, so clashes can occur with seemingly unrelated
909 variants.
910
911 ```
912 enum Bad {
913     X,
914     Y = 0
915 }
916 ```
917
918 Here `X` will have already been assigned the discriminant 0 by the time `Y` is
919 encountered, so a conflict occurs.
920 "##,
921
922 E0082: r##"
923 The default type for enum discriminants is `isize`, but it can be adjusted by
924 adding the `repr` attribute to the enum declaration. This error indicates that
925 an integer literal given as a discriminant is not a member of the discriminant
926 type. For example:
927
928 ```
929 #[repr(u8)]
930 enum Thing {
931     A = 1024,
932     B = 5
933 }
934 ```
935
936 Here, 1024 lies outside the valid range for `u8`, so the discriminant for `A` is
937 invalid. You may want to change representation types to fix this, or else change
938 invalid discriminant values so that they fit within the existing type.
939
940 Note also that without a representation manually defined, the compiler will
941 optimize by using the smallest integer type possible.
942 "##,
943
944 E0083: r##"
945 At present, it's not possible to define a custom representation for an enum with
946 a single variant. As a workaround you can add a `Dummy` variant.
947
948 See: https://github.com/rust-lang/rust/issues/10292
949 "##,
950
951 E0084: r##"
952 It is impossible to define an integer type to be used to represent zero-variant
953 enum values because there are no zero-variant enum values. There is no way to
954 construct an instance of the following type using only safe code:
955
956 ```
957 enum Empty {}
958 ```
959 "##,
960
961 E0087: r##"
962 Too many type parameters were supplied for a function. For example:
963
964 ```
965 fn foo<T>() {}
966
967 fn main() {
968     foo::<f64, bool>(); // error, expected 1 parameter, found 2 parameters
969 }
970 ```
971
972 The number of supplied parameters much exactly match the number of defined type
973 parameters.
974 "##,
975
976 E0088: r##"
977 You gave too many lifetime parameters. Erroneous code example:
978
979 ```
980 fn f() {}
981
982 fn main() {
983     f::<'static>() // error: too many lifetime parameters provided
984 }
985 ```
986
987 Please check you give the right number of lifetime parameters. Example:
988
989 ```
990 fn f() {}
991
992 fn main() {
993     f() // ok!
994 }
995 ```
996
997 It's also important to note that the Rust compiler can generally
998 determine the lifetime by itself. Example:
999
1000 ```
1001 struct Foo {
1002     value: String
1003 }
1004
1005 impl Foo {
1006     // it can be written like this
1007     fn get_value<'a>(&'a self) -> &'a str { &self.value }
1008     // but the compiler works fine with this too:
1009     fn without_lifetime(&self) -> &str { &self.value }
1010 }
1011
1012 fn main() {
1013     let f = Foo { value: "hello".to_owned() };
1014
1015     println!("{}", f.get_value());
1016     println!("{}", f.without_lifetime());
1017 }
1018 ```
1019 "##,
1020
1021 E0089: r##"
1022 Not enough type parameters were supplied for a function. For example:
1023
1024 ```
1025 fn foo<T, U>() {}
1026
1027 fn main() {
1028     foo::<f64>(); // error, expected 2 parameters, found 1 parameter
1029 }
1030 ```
1031
1032 Note that if a function takes multiple type parameters but you want the compiler
1033 to infer some of them, you can use type placeholders:
1034
1035 ```
1036 fn foo<T, U>(x: T) {}
1037
1038 fn main() {
1039     let x: bool = true;
1040     foo::<f64>(x);    // error, expected 2 parameters, found 1 parameter
1041     foo::<_, f64>(x); // same as `foo::<bool, f64>(x)`
1042 }
1043 ```
1044 "##,
1045
1046 E0091: r##"
1047 You gave an unnecessary type parameter in a type alias. Erroneous code
1048 example:
1049
1050 ```
1051 type Foo<T> = u32; // error: type parameter `T` is unused
1052 // or:
1053 type Foo<A,B> = Box<A>; // error: type parameter `B` is unused
1054 ```
1055
1056 Please check you didn't write too many type parameters. Example:
1057
1058 ```
1059 type Foo = u32; // ok!
1060 type Foo<A> = Box<A>; // ok!
1061 ```
1062 "##,
1063
1064 E0092: r##"
1065 You tried to declare an undefined atomic operation function.
1066 Erroneous code example:
1067
1068 ```
1069 #![feature(intrinsics)]
1070
1071 extern "rust-intrinsic" {
1072     fn atomic_foo(); // error: unrecognized atomic operation
1073                      //        function
1074 }
1075 ```
1076
1077 Please check you didn't make a mistake in the function's name. All intrinsic
1078 functions are defined in librustc_trans/trans/intrinsic.rs and in
1079 libcore/intrinsics.rs in the Rust source code. Example:
1080
1081 ```
1082 #![feature(intrinsics)]
1083
1084 extern "rust-intrinsic" {
1085     fn atomic_fence(); // ok!
1086 }
1087 ```
1088 "##,
1089
1090 E0093: r##"
1091 You declared an unknown intrinsic function. Erroneous code example:
1092
1093 ```
1094 #![feature(intrinsics)]
1095
1096 extern "rust-intrinsic" {
1097     fn foo(); // error: unrecognized intrinsic function: `foo`
1098 }
1099
1100 fn main() {
1101     unsafe {
1102         foo();
1103     }
1104 }
1105 ```
1106
1107 Please check you didn't make a mistake in the function's name. All intrinsic
1108 functions are defined in librustc_trans/trans/intrinsic.rs and in
1109 libcore/intrinsics.rs in the Rust source code. Example:
1110
1111 ```
1112 #![feature(intrinsics)]
1113
1114 extern "rust-intrinsic" {
1115     fn atomic_fence(); // ok!
1116 }
1117
1118 fn main() {
1119     unsafe {
1120         atomic_fence();
1121     }
1122 }
1123 ```
1124 "##,
1125
1126 E0094: r##"
1127 You gave an invalid number of type parameters to an intrinsic function.
1128 Erroneous code example:
1129
1130 ```
1131 #![feature(intrinsics)]
1132
1133 extern "rust-intrinsic" {
1134     fn size_of<T, U>() -> usize; // error: intrinsic has wrong number
1135                                  //        of type parameters
1136 }
1137 ```
1138
1139 Please check that you provided the right number of lifetime parameters
1140 and verify with the function declaration in the Rust source code.
1141 Example:
1142
1143 ```
1144 #![feature(intrinsics)]
1145
1146 extern "rust-intrinsic" {
1147     fn size_of<T>() -> usize; // ok!
1148 }
1149 ```
1150 "##,
1151
1152 E0101: r##"
1153 You hit this error because the compiler the compiler lacks information
1154 to determine a type for this expression. Erroneous code example:
1155
1156 ```
1157 fn main() {
1158     let x = |_| {}; // error: cannot determine a type for this expression
1159 }
1160 ```
1161
1162 You have two possibilities to solve this situation:
1163  * Give an explicit definition of the expression
1164  * Infer the expression
1165
1166 Examples:
1167
1168 ```
1169 fn main() {
1170     let x = |_ : u32| {}; // ok!
1171     // or:
1172     let x = |_| {};
1173     x(0u32);
1174 }
1175 ```
1176 "##,
1177
1178 E0106: r##"
1179 This error indicates that a lifetime is missing from a type. If it is an error
1180 inside a function signature, the problem may be with failing to adhere to the
1181 lifetime elision rules (see below).
1182
1183 Here are some simple examples of where you'll run into this error:
1184
1185 ```
1186 struct Foo { x: &bool }        // error
1187 struct Foo<'a> { x: &'a bool } // correct
1188
1189 enum Bar { A(u8), B(&bool), }        // error
1190 enum Bar<'a> { A(u8), B(&'a bool), } // correct
1191
1192 type MyStr = &str;        // error
1193 type MyStr<'a> = &'a str; //correct
1194
1195 ```
1196
1197 Lifetime elision is a special, limited kind of inference for lifetimes in
1198 function signatures which allows you to leave out lifetimes in certain cases.
1199 For more background on lifetime elision see [the book][book-le].
1200
1201 The lifetime elision rules require that any function signature with an elided
1202 output lifetime must either have
1203
1204  - exactly one input lifetime
1205  - or, multiple input lifetimes, but the function must also be a method with a
1206    `&self` or `&mut self` receiver
1207
1208 In the first case, the output lifetime is inferred to be the same as the unique
1209 input lifetime. In the second case, the lifetime is instead inferred to be the
1210 same as the lifetime on `&self` or `&mut self`.
1211
1212 Here are some examples of elision errors:
1213
1214 ```
1215 // error, no input lifetimes
1216 fn foo() -> &str { ... }
1217
1218 // error, `x` and `y` have distinct lifetimes inferred
1219 fn bar(x: &str, y: &str) -> &str { ... }
1220
1221 // error, `y`'s lifetime is inferred to be distinct from `x`'s
1222 fn baz<'a>(x: &'a str, y: &str) -> &str { ... }
1223 ```
1224
1225 [book-le]: http://doc.rust-lang.org/nightly/book/lifetimes.html#lifetime-elision
1226 "##,
1227
1228 E0107: r##"
1229 This error means that an incorrect number of lifetime parameters were provided
1230 for a type (like a struct or enum) or trait.
1231
1232 Some basic examples include:
1233
1234 ```
1235 struct Foo<'a>(&'a str);
1236 enum Bar { A, B, C }
1237
1238 struct Baz<'a> {
1239     foo: Foo,     // error: expected 1, found 0
1240     bar: Bar<'a>, // error: expected 0, found 1
1241 }
1242 ```
1243
1244 Here's an example that is currently an error, but may work in a future version
1245 of Rust:
1246
1247 ```
1248 struct Foo<'a>(&'a str);
1249
1250 trait Quux { }
1251 impl Quux for Foo { } // error: expected 1, found 0
1252 ```
1253
1254 Lifetime elision in implementation headers was part of the lifetime elision
1255 RFC. It is, however, [currently unimplemented][iss15872].
1256
1257 [iss15872]: https://github.com/rust-lang/rust/issues/15872
1258 "##,
1259
1260 E0116: r##"
1261 You can only define an inherent implementation for a type in the same crate
1262 where the type was defined. For example, an `impl` block as below is not allowed
1263 since `Vec` is defined in the standard library:
1264
1265 ```
1266 impl Vec<u8> { ... } // error
1267 ```
1268
1269 To fix this problem, you can do either of these things:
1270
1271  - define a trait that has the desired associated functions/types/constants and
1272    implement the trait for the type in question
1273  - define a new type wrapping the type and define an implementation on the new
1274    type
1275
1276 Note that using the `type` keyword does not work here because `type` only
1277 introduces a type alias:
1278
1279 ```
1280 type Bytes = Vec<u8>;
1281
1282 impl Bytes { ... } // error, same as above
1283 ```
1284 "##,
1285
1286 E0117: r##"
1287 You got this error because because you tried to implement a foreign
1288 trait for a foreign type (with maybe a foreign type parameter). Erroneous
1289 code example:
1290
1291 ```
1292 impl Drop for u32 {}
1293 ```
1294
1295 The type, trait or the type parameter (or all of them) has to be defined
1296 in your crate. Example:
1297
1298 ```
1299 pub struct Foo; // you define your type in your crate
1300
1301 impl Drop for Foo { // and you can implement the trait on it!
1302     // code of trait implementation here
1303 }
1304
1305 trait Bar { // or define your trait in your crate
1306     fn get(&self) -> usize;
1307 }
1308
1309 impl Bar for u32 { // and then you implement it on a foreign type
1310     fn get(&self) -> usize { 0 }
1311 }
1312
1313 impl From<Foo> for i32 { // or you use a type from your crate as
1314                          // a type parameter
1315     fn from(i: Foo) -> i32 {
1316         0
1317     }
1318 }
1319 ```
1320 "##,
1321
1322 E0119: r##"
1323 There are conflicting trait implementations for the same type.
1324 Example of erroneous code:
1325
1326 ```
1327 trait MyTrait {
1328     fn get(&self) -> usize;
1329 }
1330
1331 impl<T> MyTrait for T {
1332     fn get(&self) -> usize { 0 }
1333 }
1334
1335 struct Foo {
1336     value: usize
1337 }
1338
1339 impl MyTrait for Foo { // error: conflicting implementations for trait
1340                        //        `MyTrait`
1341     fn get(&self) -> usize { self.value }
1342 }
1343 ```
1344
1345 When looking for the implementation for the trait, the compiler finds
1346 both the `impl<T> MyTrait for T` where T is all types and the `impl
1347 MyTrait for Foo`. Since a trait cannot be implemented multiple times,
1348 this is an error. So, when you write:
1349
1350 ```
1351 impl<T> MyTrait for T {
1352     fn get(&self) -> usize { 0 }
1353 }
1354 ```
1355
1356 This makes the trait implemented on all types in the scope. So if you
1357 try to implement it on another one after that, the implementations will
1358 conflict. Example:
1359
1360 ```
1361 trait MyTrait {
1362     fn get(&self) -> usize;
1363 }
1364
1365 impl<T> MyTrait for T {
1366     fn get(&self) -> usize { 0 }
1367 }
1368
1369 struct Foo;
1370
1371 fn main() {
1372     let f = Foo;
1373
1374     f.get(); // the trait is implemented so we can use it
1375 }
1376 ```
1377 "##,
1378
1379 E0120: r##"
1380 An attempt was made to implement Drop on a trait, which is not allowed: only
1381 structs and enums can implement Drop. An example causing this error:
1382
1383 ```
1384 trait MyTrait {}
1385
1386 impl Drop for MyTrait {
1387     fn drop(&mut self) {}
1388 }
1389 ```
1390
1391 A workaround for this problem is to wrap the trait up in a struct, and implement
1392 Drop on that. An example is shown below:
1393
1394 ```
1395 trait MyTrait {}
1396 struct MyWrapper<T: MyTrait> { foo: T }
1397
1398 impl <T: MyTrait> Drop for MyWrapper<T> {
1399     fn drop(&mut self) {}
1400 }
1401
1402 ```
1403
1404 Alternatively, wrapping trait objects requires something like the following:
1405
1406 ```
1407 trait MyTrait {}
1408
1409 //or Box<MyTrait>, if you wanted an owned trait object
1410 struct MyWrapper<'a> { foo: &'a MyTrait }
1411
1412 impl <'a> Drop for MyWrapper<'a> {
1413     fn drop(&mut self) {}
1414 }
1415 ```
1416 "##,
1417
1418 E0121: r##"
1419 In order to be consistent with Rust's lack of global type inference, type
1420 placeholders are disallowed by design in item signatures.
1421
1422 Examples of this error include:
1423
1424 ```
1425 fn foo() -> _ { 5 } // error, explicitly write out the return type instead
1426
1427 static BAR: _ = "test"; // error, explicitly write out the type instead
1428 ```
1429 "##,
1430
1431 E0124: r##"
1432 You declared two fields of a struct with the same name. Erroneous code
1433 example:
1434
1435 ```
1436 struct Foo {
1437     field1: i32,
1438     field1: i32 // error: field is already declared
1439 }
1440 ```
1441
1442 Please verify that the field names have been correctly spelled. Example:
1443
1444 ```
1445 struct Foo {
1446     field1: i32,
1447     field2: i32 // ok!
1448 }
1449 ```
1450 "##,
1451
1452 E0128: r##"
1453 Type parameter defaults can only use parameters that occur before them.
1454 Erroneous code example:
1455
1456 ```
1457 pub struct Foo<T=U, U=()> {
1458     field1: T,
1459     filed2: U,
1460 }
1461 // error: type parameters with a default cannot use forward declared
1462 // identifiers
1463 ```
1464
1465 Since type parameters are evaluated in-order, you may be able to fix this issue
1466 by doing:
1467
1468 ```
1469 pub struct Foo<U=(), T=U> {
1470     field1: T,
1471     filed2: U,
1472 }
1473 ```
1474
1475 Please also verify that this wasn't because of a name-clash and rename the type
1476 parameter if so.
1477 "##,
1478
1479 E0130: r##"
1480 You declared a pattern as an argument in a foreign function declaration.
1481 Erroneous code example:
1482
1483 ```
1484 extern {
1485     fn foo((a, b): (u32, u32)); // error: patterns aren't allowed in foreign
1486                                 //        function declarations
1487 }
1488 ```
1489
1490 Please replace the pattern argument with a regular one. Example:
1491
1492 ```
1493 struct SomeStruct {
1494     a: u32,
1495     b: u32,
1496 }
1497
1498 extern {
1499     fn foo(s: SomeStruct); // ok!
1500 }
1501 // or
1502 extern {
1503     fn foo(a: (u32, u32)); // ok!
1504 }
1505 ```
1506 "##,
1507
1508 E0131: r##"
1509 It is not possible to define `main` with type parameters, or even with function
1510 parameters. When `main` is present, it must take no arguments and return `()`.
1511 "##,
1512
1513 E0132: r##"
1514 It is not possible to declare type parameters on a function that has the `start`
1515 attribute. Such a function must have the following type signature:
1516
1517 ```
1518 fn(isize, *const *const u8) -> isize
1519 ```
1520 "##,
1521
1522 E0159: r##"
1523 You tried to use a trait as a struct constructor. Erroneous code example:
1524
1525 ```
1526 trait TraitNotAStruct {}
1527
1528 TraitNotAStruct{ value: 0 }; // error: use of trait `TraitNotAStruct` as a
1529                              //        struct constructor
1530 ```
1531
1532 Please verify you used the correct type name or please implement the trait
1533 on a struct and use this struct constructor. Example:
1534
1535 ```
1536 trait TraitNotAStruct {}
1537
1538 struct Foo {
1539     value: i32
1540 }
1541
1542 Foo{ value: 0 }; // ok!
1543 ```
1544 "##,
1545
1546 E0166: r##"
1547 This error means that the compiler found a return expression in a function
1548 marked as diverging. A function diverges if it has `!` in the place of the
1549 return type in its signature. For example:
1550
1551 ```
1552 fn foo() -> ! { return; } // error
1553 ```
1554
1555 For a function that diverges, every control path in the function must never
1556 return, for example with a `loop` that never breaks or a call to another
1557 diverging function (such as `panic!()`).
1558 "##,
1559
1560 E0172: r##"
1561 This error means that an attempt was made to specify the type of a variable with
1562 a combination of a concrete type and a trait. Consider the following example:
1563
1564 ```
1565 fn foo(bar: i32+std::fmt::Display) {}
1566 ```
1567
1568 The code is trying to specify that we want to receive a signed 32-bit integer
1569 which also implements `Display`. This doesn't make sense: when we pass `i32`, a
1570 concrete type, it implicitly includes all of the traits that it implements.
1571 This includes `Display`, `Debug`, `Clone`, and a host of others.
1572
1573 If `i32` implements the trait we desire, there's no need to specify the trait
1574 separately. If it does not, then we need to `impl` the trait for `i32` before
1575 passing it into `foo`. Either way, a fixed definition for `foo` will look like
1576 the following:
1577
1578 ```
1579 fn foo(bar: i32) {}
1580 ```
1581
1582 To learn more about traits, take a look at the Book:
1583
1584 https://doc.rust-lang.org/book/traits.html
1585 "##,
1586
1587 E0178: r##"
1588 In types, the `+` type operator has low precedence, so it is often necessary
1589 to use parentheses.
1590
1591 For example:
1592
1593 ```
1594 trait Foo {}
1595
1596 struct Bar<'a> {
1597     w: &'a Foo + Copy,   // error, use &'a (Foo + Copy)
1598     x: &'a Foo + 'a,     // error, use &'a (Foo + 'a)
1599     y: &'a mut Foo + 'a, // error, use &'a mut (Foo + 'a)
1600     z: fn() -> Foo + 'a, // error, use fn() -> (Foo + 'a)
1601 }
1602 ```
1603
1604 More details can be found in [RFC 438].
1605
1606 [RFC 438]: https://github.com/rust-lang/rfcs/pull/438
1607 "##,
1608
1609 E0184: r##"
1610 Explicitly implementing both Drop and Copy for a type is currently disallowed.
1611 This feature can make some sense in theory, but the current implementation is
1612 incorrect and can lead to memory unsafety (see [issue #20126][iss20126]), so
1613 it has been disabled for now.
1614
1615 [iss20126]: https://github.com/rust-lang/rust/issues/20126
1616 "##,
1617
1618 E0185: r##"
1619 An associated function for a trait was defined to be static, but an
1620 implementation of the trait declared the same function to be a method (i.e. to
1621 take a `self` parameter).
1622
1623 Here's an example of this error:
1624
1625 ```
1626 trait Foo {
1627     fn foo();
1628 }
1629
1630 struct Bar;
1631
1632 impl Foo for Bar {
1633     // error, method `foo` has a `&self` declaration in the impl, but not in
1634     // the trait
1635     fn foo(&self) {}
1636 }
1637 "##,
1638
1639 E0186: r##"
1640 An associated function for a trait was defined to be a method (i.e. to take a
1641 `self` parameter), but an implementation of the trait declared the same function
1642 to be static.
1643
1644 Here's an example of this error:
1645
1646 ```
1647 trait Foo {
1648     fn foo(&self);
1649 }
1650
1651 struct Bar;
1652
1653 impl Foo for Bar {
1654     // error, method `foo` has a `&self` declaration in the trait, but not in
1655     // the impl
1656     fn foo() {}
1657 }
1658 ```
1659 "##,
1660
1661 E0191: r##"
1662 Trait objects need to have all associated types specified. Erroneous code
1663 example:
1664
1665 ```
1666 trait Trait {
1667     type Bar;
1668 }
1669
1670 type Foo = Trait; // error: the value of the associated type `Bar` (from
1671                   //        the trait `Trait`) must be specified
1672 ```
1673
1674 Please verify you specified all associated types of the trait and that you
1675 used the right trait. Example:
1676
1677 ```
1678 trait Trait {
1679     type Bar;
1680 }
1681
1682 type Foo = Trait<Bar=i32>; // ok!
1683 ```
1684 "##,
1685
1686 E0192: r##"
1687 Negative impls are only allowed for traits with default impls. For more
1688 information see the [opt-in builtin traits RFC](https://github.com/rust-lang/
1689 rfcs/blob/master/text/0019-opt-in-builtin-traits.md).
1690 "##,
1691
1692 E0195: r##"
1693 Your method's lifetime parameters do not match the trait declaration.
1694 Erroneous code example:
1695
1696 ```
1697 trait Trait {
1698     fn bar<'a,'b:'a>(x: &'a str, y: &'b str);
1699 }
1700
1701 struct Foo;
1702
1703 impl Trait for Foo {
1704     fn bar<'a,'b>(x: &'a str, y: &'b str) {
1705     // error: lifetime parameters or bounds on method `bar`
1706     // do not match the trait declaration
1707     }
1708 }
1709 ```
1710
1711 The lifetime constraint `'b` for bar() implementation does not match the
1712 trait declaration. Ensure lifetime declarations match exactly in both trait
1713 declaration and implementation. Example:
1714
1715 ```
1716 trait Trait {
1717     fn t<'a,'b:'a>(x: &'a str, y: &'b str);
1718 }
1719
1720 struct Foo;
1721
1722 impl Trait for Foo {
1723     fn t<'a,'b:'a>(x: &'a str, y: &'b str) { // ok!
1724     }
1725 }
1726 ```
1727 "##,
1728
1729 E0197: r##"
1730 Inherent implementations (one that do not implement a trait but provide
1731 methods associated with a type) are always safe because they are not
1732 implementing an unsafe trait. Removing the `unsafe` keyword from the inherent
1733 implementation will resolve this error.
1734
1735 ```
1736 struct Foo;
1737
1738 // this will cause this error
1739 unsafe impl Foo { }
1740 // converting it to this will fix it
1741 impl Foo { }
1742 ```
1743
1744 "##,
1745
1746 E0198: r##"
1747 A negative implementation is one that excludes a type from implementing a
1748 particular trait. Not being able to use a trait is always a safe operation,
1749 so negative implementations are always safe and never need to be marked as
1750 unsafe.
1751
1752 ```
1753 struct Foo;
1754
1755 // unsafe is unnecessary
1756 unsafe impl !Clone for Foo { }
1757 // this will compile
1758 impl !Clone for Foo { }
1759 ```
1760
1761 "##,
1762
1763 E0199: r##"
1764 Safe traits should not have unsafe implementations, therefore marking an
1765 implementation for a safe trait unsafe will cause a compiler error. Removing the
1766 unsafe marker on the trait noted in the error will resolve this problem.
1767
1768 ```
1769 struct Foo;
1770
1771 trait Bar { }
1772
1773 // this won't compile because Bar is safe
1774 unsafe impl Bar for Foo { }
1775 // this will compile
1776 impl Bar for Foo { }
1777 ```
1778
1779 "##,
1780
1781 E0200: r##"
1782 Unsafe traits must have unsafe implementations. This error occurs when an
1783 implementation for an unsafe trait isn't marked as unsafe. This may be resolved
1784 by marking the unsafe implementation as unsafe.
1785
1786 ```
1787 struct Foo;
1788
1789 unsafe trait Bar { }
1790
1791 // this won't compile because Bar is unsafe and impl isn't unsafe
1792 impl Bar for Foo { }
1793 // this will compile
1794 unsafe impl Bar for Foo { }
1795 ```
1796
1797 "##,
1798
1799 E0201: r##"
1800 It is an error to define two associated items (like methods, associated types,
1801 associated functions, etc.) with the same identifier.
1802
1803 For example:
1804
1805 ```
1806 struct Foo(u8);
1807
1808 impl Foo {
1809     fn bar(&self) -> bool { self.0 > 5 }
1810     fn bar() {} // error: duplicate associated function
1811 }
1812
1813 trait Baz {
1814     type Quux;
1815     fn baz(&self) -> bool;
1816 }
1817
1818 impl Baz for Foo {
1819     type Quux = u32;
1820
1821     fn baz(&self) -> bool { true }
1822
1823     // error: duplicate method
1824     fn baz(&self) -> bool { self.0 > 5 }
1825
1826     // error: duplicate associated type
1827     type Quux = u32;
1828 }
1829 ```
1830 "##,
1831
1832 E0202: r##"
1833 Inherent associated types were part of [RFC 195] but are not yet implemented.
1834 See [the tracking issue][iss8995] for the status of this implementation.
1835
1836 [RFC 195]: https://github.com/rust-lang/rfcs/pull/195
1837 [iss8995]: https://github.com/rust-lang/rust/issues/8995
1838 "##,
1839
1840 E0204: r##"
1841 An attempt to implement the `Copy` trait for a struct failed because one of the
1842 fields does not implement `Copy`. To fix this, you must implement `Copy` for the
1843 mentioned field. Note that this may not be possible, as in the example of
1844
1845 ```
1846 struct Foo {
1847     foo : Vec<u32>,
1848 }
1849
1850 impl Copy for Foo { }
1851 ```
1852
1853 This fails because `Vec<T>` does not implement `Copy` for any `T`.
1854
1855 Here's another example that will fail:
1856
1857 ```
1858 #[derive(Copy)]
1859 struct Foo<'a> {
1860     ty: &'a mut bool,
1861 }
1862 ```
1863
1864 This fails because `&mut T` is not `Copy`, even when `T` is `Copy` (this
1865 differs from the behavior for `&T`, which is always `Copy`).
1866 "##,
1867
1868 E0205: r##"
1869 An attempt to implement the `Copy` trait for an enum failed because one of the
1870 variants does not implement `Copy`. To fix this, you must implement `Copy` for
1871 the mentioned variant. Note that this may not be possible, as in the example of
1872
1873 ```
1874 enum Foo {
1875     Bar(Vec<u32>),
1876     Baz,
1877 }
1878
1879 impl Copy for Foo { }
1880 ```
1881
1882 This fails because `Vec<T>` does not implement `Copy` for any `T`.
1883
1884 Here's another example that will fail:
1885
1886 ```
1887 #[derive(Copy)]
1888 enum Foo<'a> {
1889     Bar(&'a mut bool),
1890     Baz
1891 }
1892 ```
1893
1894 This fails because `&mut T` is not `Copy`, even when `T` is `Copy` (this
1895 differs from the behavior for `&T`, which is always `Copy`).
1896 "##,
1897
1898 E0206: r##"
1899 You can only implement `Copy` for a struct or enum. Both of the following
1900 examples will fail, because neither `i32` (primitive type) nor `&'static Bar`
1901 (reference to `Bar`) is a struct or enum:
1902
1903 ```
1904 type Foo = i32;
1905 impl Copy for Foo { } // error
1906
1907 #[derive(Copy, Clone)]
1908 struct Bar;
1909 impl Copy for &'static Bar { } // error
1910 ```
1911 "##,
1912
1913 E0207: r##"
1914 You declared an unused type parameter when implementing a trait on an object.
1915 Erroneous code example:
1916
1917 ```
1918 trait MyTrait {
1919     fn get(&self) -> usize;
1920 }
1921
1922 struct Foo;
1923
1924 impl<T> MyTrait for Foo {
1925     fn get(&self) -> usize {
1926         0
1927     }
1928 }
1929 ```
1930
1931 Please check your object definition and remove unused type
1932 parameter(s). Example:
1933
1934 ```
1935 trait MyTrait {
1936     fn get(&self) -> usize;
1937 }
1938
1939 struct Foo;
1940
1941 impl MyTrait for Foo {
1942     fn get(&self) -> usize {
1943         0
1944     }
1945 }
1946 ```
1947 "##,
1948
1949 E0211: r##"
1950 You used an intrinsic function which doesn't correspond to its
1951 definition. Erroneous code example:
1952
1953 ```
1954 #![feature(intrinsics)]
1955
1956 extern "rust-intrinsic" {
1957     fn size_of<T>(); // error: intrinsic has wrong type
1958 }
1959 ```
1960
1961 Please check the function definition. Example:
1962
1963 ```
1964 #![feature(intrinsics)]
1965
1966 extern "rust-intrinsic" {
1967     fn size_of<T>() -> usize;
1968 }
1969 ```
1970 "##,
1971
1972 E0220: r##"
1973 You used an associated type which isn't defined in the trait.
1974 Erroneous code example:
1975
1976 ```
1977 trait Trait {
1978     type Bar;
1979 }
1980
1981 type Foo = Trait<F=i32>; // error: associated type `F` not found for
1982                          //        `Trait`
1983 ```
1984
1985 Please verify you used the right trait or you didn't misspell the
1986 associated type name. Example:
1987
1988 ```
1989 trait Trait {
1990     type Bar;
1991 }
1992
1993 type Foo = Trait<Bar=i32>; // ok!
1994 ```
1995 "##,
1996
1997 E0223: r##"
1998 An attempt was made to retrieve an associated type, but the type was ambiguous.
1999 For example:
2000
2001 ```
2002 trait MyTrait {type X; }
2003
2004 fn main() {
2005     let foo: MyTrait::X;
2006 }
2007 ```
2008
2009 The problem here is that we're attempting to take the type of X from MyTrait.
2010 Unfortunately, the type of X is not defined, because it's only made concrete in
2011 implementations of the trait. A working version of this code might look like:
2012
2013 ```
2014 trait MyTrait {type X; }
2015 struct MyStruct;
2016
2017 impl MyTrait for MyStruct {
2018     type X = u32;
2019 }
2020
2021 fn main() {
2022     let foo: <MyStruct as MyTrait>::X;
2023 }
2024 ```
2025
2026 This syntax specifies that we want the X type from MyTrait, as made concrete in
2027 MyStruct. The reason that we cannot simply use `MyStruct::X` is that MyStruct
2028 might implement two different traits with identically-named associated types.
2029 This syntax allows disambiguation between the two.
2030 "##,
2031
2032 E0225: r##"
2033 You attempted to use multiple types as bounds for a closure or trait object.
2034 Rust does not currently support this. A simple example that causes this error:
2035
2036 ```
2037 fn main() {
2038     let _: Box<std::io::Read+std::io::Write>;
2039 }
2040 ```
2041
2042 Builtin traits are an exception to this rule: it's possible to have bounds of
2043 one non-builtin type, plus any number of builtin types. For example, the
2044 following compiles correctly:
2045
2046 ```
2047 fn main() {
2048     let _: Box<std::io::Read+Copy+Sync>;
2049 }
2050 ```
2051 "##,
2052
2053 E0232: r##"
2054 The attribute must have a value. Erroneous code example:
2055
2056 ```
2057 #[rustc_on_unimplemented] // error: this attribute must have a value
2058 trait Bar {}
2059 ```
2060
2061 Please supply the missing value of the attribute. Example:
2062
2063 ```
2064 #[rustc_on_unimplemented = "foo"] // ok!
2065 trait Bar {}
2066 ```
2067 "##,
2068
2069 E0243: r##"
2070 This error indicates that not enough type parameters were found in a type or
2071 trait.
2072
2073 For example, the `Foo` struct below is defined to be generic in `T`, but the
2074 type parameter is missing in the definition of `Bar`:
2075
2076 ```
2077 struct Foo<T> { x: T }
2078
2079 struct Bar { x: Foo }
2080 ```
2081 "##,
2082
2083 E0244: r##"
2084 This error indicates that too many type parameters were found in a type or
2085 trait.
2086
2087 For example, the `Foo` struct below has no type parameters, but is supplied
2088 with two in the definition of `Bar`:
2089
2090 ```
2091 struct Foo { x: bool }
2092
2093 struct Bar<S, T> { x: Foo<S, T> }
2094 ```
2095 "##,
2096
2097 E0249: r##"
2098 This error indicates a constant expression for the array length was found, but
2099 it was not an integer (signed or unsigned) expression.
2100
2101 Some examples of code that produces this error are:
2102
2103 ```
2104 const A: [u32; "hello"] = []; // error
2105 const B: [u32; true] = []; // error
2106 const C: [u32; 0.0] = []; // error
2107 "##,
2108
2109 E0250: r##"
2110 There was an error while evaluating the expression for the length of a fixed-
2111 size array type.
2112
2113 Some examples of this error are:
2114
2115 ```
2116 // divide by zero in the length expression
2117 const A: [u32; 1/0] = [];
2118
2119 // Rust currently will not evaluate the function `foo` at compile time
2120 fn foo() -> usize { 12 }
2121 const B: [u32; foo()] = [];
2122
2123 // it is an error to try to add `u8` and `f64`
2124 use std::{f64, u8};
2125 const C: [u32; u8::MAX + f64::EPSILON] = [];
2126 ```
2127 "##,
2128
2129 E0318: r##"
2130 Default impls for a trait must be located in the same crate where the trait was
2131 defined. For more information see the [opt-in builtin traits RFC](https://github
2132 .com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md).
2133 "##,
2134
2135 E0322: r##"
2136 The `Sized` trait is a special trait built-in to the compiler for types with a
2137 constant size known at compile-time. This trait is automatically implemented
2138 for types as needed by the compiler, and it is currently disallowed to
2139 explicitly implement it for a type.
2140 "##,
2141
2142 E0326: r##"
2143 The types of any associated constants in a trait implementation must match the
2144 types in the trait definition. This error indicates that there was a mismatch.
2145
2146 Here's an example of this error:
2147
2148 ```
2149 trait Foo {
2150     const BAR: bool;
2151 }
2152
2153 struct Bar;
2154
2155 impl Foo for Bar {
2156     const BAR: u32 = 5; // error, expected bool, found u32
2157 }
2158 ```
2159 "##,
2160
2161 E0327: r##"
2162 You cannot use associated items other than constant items as patterns. This
2163 includes method items. Example of erroneous code:
2164
2165 ```
2166 enum B {}
2167
2168 impl B {
2169     fn bb() -> i32 { 0 }
2170 }
2171
2172 fn main() {
2173     match 0 {
2174         B::bb => {} // error: associated items in match patterns must
2175                     // be constants
2176     }
2177 }
2178 ```
2179
2180 Please check that you're not using a method as a pattern. Example:
2181
2182 ```
2183 enum B {
2184     ba,
2185     bb
2186 }
2187
2188 fn main() {
2189     match B::ba {
2190         B::bb => {} // ok!
2191         _ => {}
2192     }
2193 }
2194 ```
2195 "##,
2196
2197 E0368: r##"
2198 This error indicates that a binary assignment operator like `+=` or `^=` was
2199 applied to the wrong types. For example:
2200
2201 ```
2202 let mut x: u16 = 5;
2203 x ^= true; // error, `^=` cannot be applied to types `u16` and `bool`
2204 x += ();   // error, `+=` cannot be applied to types `u16` and `()`
2205 ```
2206
2207 Another problem you might be facing is this: suppose you've overloaded the `+`
2208 operator for some type `Foo` by implementing the `std::ops::Add` trait for
2209 `Foo`, but you find that using `+=` does not work, as in this example:
2210
2211 ```
2212 use std::ops::Add;
2213
2214 struct Foo(u32);
2215
2216 impl Add for Foo {
2217     type Output = Foo;
2218
2219     fn add(self, rhs: Foo) -> Foo {
2220         Foo(self.0 + rhs.0)
2221     }
2222 }
2223
2224 fn main() {
2225     let mut x: Foo = Foo(5);
2226     x += Foo(7); // error, `+= cannot be applied to types `Foo` and `Foo`
2227 }
2228 ```
2229
2230 This is because the binary assignment operators currently do not work off of
2231 traits, so it is not possible to overload them. See [RFC 953] for a proposal
2232 to change this.
2233
2234 [RFC 953]: https://github.com/rust-lang/rfcs/pull/953
2235 "##,
2236
2237 E0371: r##"
2238 When `Trait2` is a subtrait of `Trait1` (for example, when `Trait2` has a
2239 definition like `trait Trait2: Trait1 { ... }`), it is not allowed to implement
2240 `Trait1` for `Trait2`. This is because `Trait2` already implements `Trait1` by
2241 definition, so it is not useful to do this.
2242
2243 Example:
2244
2245 ```
2246 trait Foo { fn foo(&self) { } }
2247 trait Bar: Foo { }
2248 trait Baz: Bar { }
2249
2250 impl Bar for Baz { } // error, `Baz` implements `Bar` by definition
2251 impl Foo for Baz { } // error, `Baz` implements `Bar` which implements `Foo`
2252 impl Baz for Baz { } // error, `Baz` (trivially) implements `Baz`
2253 impl Baz for Bar { } // Note: This is OK
2254 ```
2255 "##,
2256
2257 E0372: r##"
2258 Trying to implement a trait for a trait object (as in `impl Trait1 for
2259 Trait2 { ... }`) does not work if the trait is not object-safe. Please see the
2260 [RFC 255] for more details on object safety rules.
2261
2262 [RFC 255]: https://github.com/rust-lang/rfcs/pull/255
2263 "##,
2264
2265 E0379: r##"
2266 Trait methods cannot be declared `const` by design. For more information, see
2267 [RFC 911].
2268
2269 [RFC 911]: https://github.com/rust-lang/rfcs/pull/911
2270 "##,
2271
2272 E0380: r##"
2273 Default impls are only allowed for traits with no methods or associated items.
2274 For more information see the [opt-in builtin traits RFC](https://github.com/rust
2275 -lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md).
2276 "##,
2277
2278 E0391: r##"
2279 This error indicates that some types or traits depend on each other
2280 and therefore cannot be constructed.
2281
2282 The following example contains a circular dependency between two traits:
2283
2284 ```
2285 trait FirstTrait : SecondTrait {
2286
2287 }
2288
2289 trait SecondTrait : FirstTrait {
2290
2291 }
2292 ```
2293 "##,
2294
2295 E0392: r##"
2296 This error indicates that a type or lifetime parameter has been declared
2297 but not actually used.  Here is an example that demonstrates the error:
2298
2299 ```
2300 enum Foo<T> {
2301     Bar
2302 }
2303 ```
2304
2305 If the type parameter was included by mistake, this error can be fixed
2306 by simply removing the type parameter, as shown below:
2307
2308 ```
2309 enum Foo {
2310     Bar
2311 }
2312 ```
2313
2314 Alternatively, if the type parameter was intentionally inserted, it must be
2315 used. A simple fix is shown below:
2316
2317 ```
2318 enum Foo<T> {
2319     Bar(T)
2320 }
2321 ```
2322
2323 This error may also commonly be found when working with unsafe code. For
2324 example, when using raw pointers one may wish to specify the lifetime for
2325 which the pointed-at data is valid. An initial attempt (below) causes this
2326 error:
2327
2328 ```
2329 struct Foo<'a, T> {
2330     x: *const T
2331 }
2332 ```
2333
2334 We want to express the constraint that Foo should not outlive `'a`, because
2335 the data pointed to by `T` is only valid for that lifetime. The problem is
2336 that there are no actual uses of `'a`. It's possible to work around this
2337 by adding a PhantomData type to the struct, using it to tell the compiler
2338 to act as if the struct contained a borrowed reference `&'a T`:
2339
2340 ```
2341 use std::marker::PhantomData;
2342
2343 struct Foo<'a, T: 'a> {
2344     x: *const T,
2345     phantom: PhantomData<&'a T>
2346 }
2347 ```
2348
2349 PhantomData can also be used to express information about unused type
2350 parameters. You can read more about it in the API documentation:
2351
2352 https://doc.rust-lang.org/std/marker/struct.PhantomData.html
2353 "##
2354
2355 }
2356
2357 register_diagnostics! {
2358     E0068,
2359     E0085,
2360     E0086,
2361     E0090,
2362     E0102,
2363     E0103,
2364     E0104,
2365     E0118,
2366     E0122,
2367     E0123,
2368     E0127,
2369     E0129,
2370     E0141,
2371     E0163,
2372     E0164,
2373     E0167,
2374     E0168,
2375     E0173, // manual implementations of unboxed closure traits are experimental
2376     E0174, // explicit use of unboxed closure methods are experimental
2377     E0182,
2378     E0183,
2379     E0187, // can't infer the kind of the closure
2380     E0188, // can not cast a immutable reference to a mutable pointer
2381     E0189, // deprecated: can only cast a boxed pointer to a boxed object
2382     E0190, // deprecated: can only cast a &-pointer to an &-object
2383     E0193, // cannot bound type where clause bounds may only be attached to types
2384            // involving type parameters
2385     E0194,
2386     E0196, // cannot determine a type for this closure
2387     E0203, // type parameter has more than one relaxed default bound,
2388            // and only one is supported
2389     E0208,
2390     E0209, // builtin traits can only be implemented on structs or enums
2391     E0210, // type parameter is not constrained by any local type
2392     E0212, // cannot extract an associated type from a higher-ranked trait bound
2393     E0213, // associated types are not accepted in this context
2394     E0214, // parenthesized parameters may only be used with a trait
2395 //  E0215, // angle-bracket notation is not stable with `Fn`
2396 //  E0216, // parenthetical notation is only stable with `Fn`
2397     E0217, // ambiguous associated type, defined in multiple supertraits
2398     E0218, // no associated type defined
2399     E0219, // associated type defined in higher-ranked supertrait
2400     E0221, // ambiguous associated type in bounds
2401 //  E0222, // Error code E0045 (variadic function must have C calling
2402            // convention) duplicate
2403     E0224, // at least one non-builtin train is required for an object type
2404     E0226, // only a single explicit lifetime bound is permitted
2405     E0227, // ambiguous lifetime bound, explicit lifetime bound required
2406     E0228, // explicit lifetime bound required
2407     E0229, // associated type bindings are not allowed here
2408     E0230, // there is no type parameter on trait
2409     E0231, // only named substitution parameters are allowed
2410     E0233,
2411     E0234,
2412     E0235, // structure constructor specifies a structure of type but
2413     E0236, // no lang item for range syntax
2414     E0237, // no lang item for range syntax
2415     E0238, // parenthesized parameters may only be used with a trait
2416     E0239, // `next` method of `Iterator` trait has unexpected type
2417     E0240,
2418     E0241,
2419     E0242, // internal error looking up a definition
2420     E0245, // not a trait
2421     E0246, // invalid recursive type
2422     E0247, // found module name used as a type
2423     E0248, // found value name used as a type
2424     E0319, // trait impls for defaulted traits allowed just for structs/enums
2425     E0320, // recursive overflow during dropck
2426     E0321, // extended coherence rules for defaulted traits violated
2427     E0323, // implemented an associated const when another trait item expected
2428     E0324, // implemented a method when another trait item expected
2429     E0325, // implemented an associated type when another trait item expected
2430     E0328, // cannot implement Unsize explicitly
2431     E0329, // associated const depends on type parameter or Self.
2432     E0366, // dropck forbid specialization to concrete type or region
2433     E0367, // dropck forbid specialization to predicate not in struct/enum
2434     E0369, // binary operation `<op>` cannot be applied to types
2435     E0374, // the trait `CoerceUnsized` may only be implemented for a coercion
2436            // between structures with one field being coerced, none found
2437     E0375, // the trait `CoerceUnsized` may only be implemented for a coercion
2438            // between structures with one field being coerced, but multiple
2439            // fields need coercions
2440     E0376, // the trait `CoerceUnsized` may only be implemented for a coercion
2441            // between structures
2442     E0377, // the trait `CoerceUnsized` may only be implemented for a coercion
2443            // between structures with the same definition
2444     E0390, // only a single inherent implementation marked with
2445            // `#[lang = \"{}\"]` is allowed for the `{}` primitive
2446     E0393, // the type parameter `{}` must be explicitly specified in an object
2447            // type because its default value `{}` references the type `Self`"
2448     E0399, // trait items need to be implemented because the associated
2449            // type `{}` was overridden
2450     E0436  // functional record update requires a struct
2451 }