]> git.lizzy.rs Git - rust.git/blob - src/librustc_typeck/diagnostics.rs
Rollup merge of #27175 - steveklabnik:channels_plus_travis, r=alexcrichton
[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 illegal. 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, illegal 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 E0081: r##"
830 Enum discriminants are used to differentiate enum variants stored in memory.
831 This error indicates that the same value was used for two or more variants,
832 making them impossible to tell apart.
833
834 ```
835 // Good.
836 enum Enum {
837     P,
838     X = 3,
839     Y = 5
840 }
841
842 // Bad.
843 enum Enum {
844     P = 3,
845     X = 3,
846     Y = 5
847 }
848 ```
849
850 Note that variants without a manually specified discriminant are numbered from
851 top to bottom starting from 0, so clashes can occur with seemingly unrelated
852 variants.
853
854 ```
855 enum Bad {
856     X,
857     Y = 0
858 }
859 ```
860
861 Here `X` will have already been assigned the discriminant 0 by the time `Y` is
862 encountered, so a conflict occurs.
863 "##,
864
865 E0082: r##"
866 The default type for enum discriminants is `isize`, but it can be adjusted by
867 adding the `repr` attribute to the enum declaration. This error indicates that
868 an integer literal given as a discriminant is not a member of the discriminant
869 type. For example:
870
871 ```
872 #[repr(u8)]
873 enum Thing {
874     A = 1024,
875     B = 5
876 }
877 ```
878
879 Here, 1024 lies outside the valid range for `u8`, so the discriminant for `A` is
880 invalid. You may want to change representation types to fix this, or else change
881 invalid discriminant values so that they fit within the existing type.
882
883 Note also that without a representation manually defined, the compiler will
884 optimize by using the smallest integer type possible.
885 "##,
886
887 E0083: r##"
888 At present, it's not possible to define a custom representation for an enum with
889 a single variant. As a workaround you can add a `Dummy` variant.
890
891 See: https://github.com/rust-lang/rust/issues/10292
892 "##,
893
894 E0084: r##"
895 It is impossible to define an integer type to be used to represent zero-variant
896 enum values because there are no zero-variant enum values. There is no way to
897 construct an instance of the following type using only safe code:
898
899 ```
900 enum Empty {}
901 ```
902 "##,
903
904 E0087: r##"
905 Too many type parameters were supplied for a function. For example:
906
907 ```
908 fn foo<T>() {}
909
910 fn main() {
911     foo::<f64, bool>(); // error, expected 1 parameter, found 2 parameters
912 }
913 ```
914
915 The number of supplied parameters much exactly match the number of defined type
916 parameters.
917 "##,
918
919 E0088: r##"
920 You gave too many lifetime parameters. Erroneous code example:
921
922 ```
923 fn f() {}
924
925 fn main() {
926     f::<'static>() // error: too many lifetime parameters provided
927 }
928 ```
929
930 Please check you give the right number of lifetime parameters. Example:
931
932 ```
933 fn f() {}
934
935 fn main() {
936     f() // ok!
937 }
938 ```
939
940 It's also important to note that the Rust compiler can generally
941 determine the lifetime by itself. Example:
942
943 ```
944 struct Foo {
945     value: String
946 }
947
948 impl Foo {
949     // it can be written like this
950     fn get_value<'a>(&'a self) -> &'a str { &self.value }
951     // but the compiler works fine with this too:
952     fn without_lifetime(&self) -> &str { &self.value }
953 }
954
955 fn main() {
956     let f = Foo { value: "hello".to_owned() };
957
958     println!("{}", f.get_value());
959     println!("{}", f.without_lifetime());
960 }
961 ```
962 "##,
963
964 E0089: r##"
965 Not enough type parameters were supplied for a function. For example:
966
967 ```
968 fn foo<T, U>() {}
969
970 fn main() {
971     foo::<f64>(); // error, expected 2 parameters, found 1 parameter
972 }
973 ```
974
975 Note that if a function takes multiple type parameters but you want the compiler
976 to infer some of them, you can use type placeholders:
977
978 ```
979 fn foo<T, U>(x: T) {}
980
981 fn main() {
982     let x: bool = true;
983     foo::<f64>(x);    // error, expected 2 parameters, found 1 parameter
984     foo::<_, f64>(x); // same as `foo::<bool, f64>(x)`
985 }
986 ```
987 "##,
988
989 E0091: r##"
990 You gave an unnecessary type parameter in a type alias. Erroneous code
991 example:
992
993 ```
994 type Foo<T> = u32; // error: type parameter `T` is unused
995 // or:
996 type Foo<A,B> = Box<A>; // error: type parameter `B` is unused
997 ```
998
999 Please check you didn't write too many type parameters. Example:
1000
1001 ```
1002 type Foo = u32; // ok!
1003 type Foo<A> = Box<A>; // ok!
1004 ```
1005 "##,
1006
1007 E0092: r##"
1008 You tried to declare an undefined atomic operation function.
1009 Erroneous code example:
1010
1011 ```
1012 #![feature(intrinsics)]
1013
1014 extern "rust-intrinsic" {
1015     fn atomic_foo(); // error: unrecognized atomic operation
1016                      //        function
1017 }
1018 ```
1019
1020 Please check you didn't make a mistake in the function's name. All intrinsic
1021 functions are defined in librustc_trans/trans/intrinsic.rs and in
1022 libcore/intrinsics.rs in the Rust source code. Example:
1023
1024 ```
1025 #![feature(intrinsics)]
1026
1027 extern "rust-intrinsic" {
1028     fn atomic_fence(); // ok!
1029 }
1030 ```
1031 "##,
1032
1033 E0093: r##"
1034 You declared an unknown intrinsic function. Erroneous code example:
1035
1036 ```
1037 #![feature(intrinsics)]
1038
1039 extern "rust-intrinsic" {
1040     fn foo(); // error: unrecognized intrinsic function: `foo`
1041 }
1042
1043 fn main() {
1044     unsafe {
1045         foo();
1046     }
1047 }
1048 ```
1049
1050 Please check you didn't make a mistake in the function's name. All intrinsic
1051 functions are defined in librustc_trans/trans/intrinsic.rs and in
1052 libcore/intrinsics.rs in the Rust source code. Example:
1053
1054 ```
1055 #![feature(intrinsics)]
1056
1057 extern "rust-intrinsic" {
1058     fn atomic_fence(); // ok!
1059 }
1060
1061 fn main() {
1062     unsafe {
1063         atomic_fence();
1064     }
1065 }
1066 ```
1067 "##,
1068
1069 E0094: r##"
1070 You gave an invalid number of type parameters to an intrinsic function.
1071 Erroneous code example:
1072
1073 ```
1074 #![feature(intrinsics)]
1075
1076 extern "rust-intrinsic" {
1077     fn size_of<T, U>() -> usize; // error: intrinsic has wrong number
1078                                  //        of type parameters
1079 }
1080 ```
1081
1082 Please check that you provided the right number of lifetime parameters
1083 and verify with the function declaration in the Rust source code.
1084 Example:
1085
1086 ```
1087 #![feature(intrinsics)]
1088
1089 extern "rust-intrinsic" {
1090     fn size_of<T>() -> usize; // ok!
1091 }
1092 ```
1093 "##,
1094
1095 E0101: r##"
1096 You hit this error because the compiler the compiler lacks information
1097 to determine a type for this expression. Erroneous code example:
1098
1099 ```
1100 fn main() {
1101     let x = |_| {}; // error: cannot determine a type for this expression
1102 }
1103 ```
1104
1105 You have two possibilities to solve this situation:
1106  * Give an explicit definition of the expression
1107  * Infer the expression
1108
1109 Examples:
1110
1111 ```
1112 fn main() {
1113     let x = |_ : u32| {}; // ok!
1114     // or:
1115     let x = |_| {};
1116     x(0u32);
1117 }
1118 ```
1119 "##,
1120
1121 E0106: r##"
1122 This error indicates that a lifetime is missing from a type. If it is an error
1123 inside a function signature, the problem may be with failing to adhere to the
1124 lifetime elision rules (see below).
1125
1126 Here are some simple examples of where you'll run into this error:
1127
1128 ```
1129 struct Foo { x: &bool }        // error
1130 struct Foo<'a> { x: &'a bool } // correct
1131
1132 enum Bar { A(u8), B(&bool), }        // error
1133 enum Bar<'a> { A(u8), B(&'a bool), } // correct
1134
1135 type MyStr = &str;        // error
1136 type MyStr<'a> = &'a str; //correct
1137
1138 ```
1139
1140 Lifetime elision is a special, limited kind of inference for lifetimes in
1141 function signatures which allows you to leave out lifetimes in certain cases.
1142 For more background on lifetime elision see [the book][book-le].
1143
1144 The lifetime elision rules require that any function signature with an elided
1145 output lifetime must either have
1146
1147  - exactly one input lifetime
1148  - or, multiple input lifetimes, but the function must also be a method with a
1149    `&self` or `&mut self` receiver
1150
1151 In the first case, the output lifetime is inferred to be the same as the unique
1152 input lifetime. In the second case, the lifetime is instead inferred to be the
1153 same as the lifetime on `&self` or `&mut self`.
1154
1155 Here are some examples of elision errors:
1156
1157 ```
1158 // error, no input lifetimes
1159 fn foo() -> &str { ... }
1160
1161 // error, `x` and `y` have distinct lifetimes inferred
1162 fn bar(x: &str, y: &str) -> &str { ... }
1163
1164 // error, `y`'s lifetime is inferred to be distinct from `x`'s
1165 fn baz<'a>(x: &'a str, y: &str) -> &str { ... }
1166 ```
1167
1168 [book-le]: http://doc.rust-lang.org/nightly/book/lifetimes.html#lifetime-elision
1169 "##,
1170
1171 E0107: r##"
1172 This error means that an incorrect number of lifetime parameters were provided
1173 for a type (like a struct or enum) or trait.
1174
1175 Some basic examples include:
1176
1177 ```
1178 struct Foo<'a>(&'a str);
1179 enum Bar { A, B, C }
1180
1181 struct Baz<'a> {
1182     foo: Foo,     // error: expected 1, found 0
1183     bar: Bar<'a>, // error: expected 0, found 1
1184 }
1185 ```
1186
1187 Here's an example that is currently an error, but may work in a future version
1188 of Rust:
1189
1190 ```
1191 struct Foo<'a>(&'a str);
1192
1193 trait Quux { }
1194 impl Quux for Foo { } // error: expected 1, found 0
1195 ```
1196
1197 Lifetime elision in implementation headers was part of the lifetime elision
1198 RFC. It is, however, [currently unimplemented][iss15872].
1199
1200 [iss15872]: https://github.com/rust-lang/rust/issues/15872
1201 "##,
1202
1203 E0116: r##"
1204 You can only define an inherent implementation for a type in the same crate
1205 where the type was defined. For example, an `impl` block as below is not allowed
1206 since `Vec` is defined in the standard library:
1207
1208 ```
1209 impl Vec<u8> { ... } // error
1210 ```
1211
1212 To fix this problem, you can do either of these things:
1213
1214  - define a trait that has the desired associated functions/types/constants and
1215    implement the trait for the type in question
1216  - define a new type wrapping the type and define an implementation on the new
1217    type
1218
1219 Note that using the `type` keyword does not work here because `type` only
1220 introduces a type alias:
1221
1222 ```
1223 type Bytes = Vec<u8>;
1224
1225 impl Bytes { ... } // error, same as above
1226 ```
1227 "##,
1228
1229 E0117: r##"
1230 You got this error because because you tried to implement a foreign
1231 trait for a foreign type (with maybe a foreign type parameter). Erroneous
1232 code example:
1233
1234 ```
1235 impl Drop for u32 {}
1236 ```
1237
1238 The type, trait or the type parameter (or all of them) has to be defined
1239 in your crate. Example:
1240
1241 ```
1242 pub struct Foo; // you define your type in your crate
1243
1244 impl Drop for Foo { // and you can implement the trait on it!
1245     // code of trait implementation here
1246 }
1247
1248 trait Bar { // or define your trait in your crate
1249     fn get(&self) -> usize;
1250 }
1251
1252 impl Bar for u32 { // and then you implement it on a foreign type
1253     fn get(&self) -> usize { 0 }
1254 }
1255
1256 impl From<Foo> for i32 { // or you use a type from your crate as
1257                          // a type parameter
1258     fn from(i: Foo) -> i32 {
1259         0
1260     }
1261 }
1262 ```
1263 "##,
1264
1265 E0119: r##"
1266 There are conflicting trait implementations for the same type.
1267 Erroneous code example:
1268
1269 ```
1270 trait MyTrait {
1271     fn get(&self) -> usize;
1272 }
1273
1274 impl<T> MyTrait for T {
1275     fn get(&self) -> usize { 0 }
1276 }
1277
1278 struct Foo {
1279     value: usize
1280 }
1281
1282 impl MyTrait for Foo { // error: conflicting implementations for trait
1283                        //        `MyTrait`
1284     fn get(&self) -> usize { self.value }
1285 }
1286 ```
1287
1288 When you write:
1289
1290 ```
1291 impl<T> MyTrait for T {
1292     fn get(&self) -> usize { 0 }
1293 }
1294 ```
1295
1296 This makes the trait implemented on all types in the scope. So if you
1297 try to implement it on another one after that, the implementations will
1298 conflict. Example:
1299
1300 ```
1301 trait MyTrait {
1302     fn get(&self) -> usize;
1303 }
1304
1305 impl<T> MyTrait for T {
1306     fn get(&self) -> usize { 0 }
1307 }
1308
1309 struct Foo;
1310
1311 fn main() {
1312     let f = Foo;
1313
1314     f.get(); // the trait is implemented so we can use it
1315 }
1316 ```
1317 "##,
1318
1319 E0121: r##"
1320 In order to be consistent with Rust's lack of global type inference, type
1321 placeholders are disallowed by design in item signatures.
1322
1323 Examples of this error include:
1324
1325 ```
1326 fn foo() -> _ { 5 } // error, explicitly write out the return type instead
1327
1328 static BAR: _ = "test"; // error, explicitly write out the type instead
1329 ```
1330 "##,
1331
1332 E0124: r##"
1333 You declared two fields of a struct with the same name. Erroneous code
1334 example:
1335
1336 ```
1337 struct Foo {
1338     field1: i32,
1339     field1: i32 // error: field is already declared
1340 }
1341 ```
1342
1343 Please verify that the field names have been correctly spelled. Example:
1344
1345 ```
1346 struct Foo {
1347     field1: i32,
1348     field2: i32 // ok!
1349 }
1350 ```
1351 "##,
1352
1353 E0128: r##"
1354 Type parameter defaults can only use parameters that occur before them.
1355 Erroneous code example:
1356
1357 ```
1358 pub struct Foo<T=U, U=()> {
1359     field1: T,
1360     filed2: U,
1361 }
1362 // error: type parameters with a default cannot use forward declared
1363 // identifiers
1364 ```
1365
1366 Since type parameters are evaluated in-order, you may be able to fix this issue
1367 by doing:
1368
1369 ```
1370 pub struct Foo<U=(), T=U> {
1371     field1: T,
1372     filed2: U,
1373 }
1374 ```
1375
1376 Please also verify that this wasn't because of a name-clash and rename the type
1377 parameter if so.
1378 "##,
1379
1380 E0130: r##"
1381 You declared a pattern as an argument in a foreign function declaration.
1382 Erroneous code example:
1383
1384 ```
1385 extern {
1386     fn foo((a, b): (u32, u32)); // error: patterns aren't allowed in foreign
1387                                 //        function declarations
1388 }
1389 ```
1390
1391 Please replace the pattern argument with a regular one. Example:
1392
1393 ```
1394 struct SomeStruct {
1395     a: u32,
1396     b: u32,
1397 }
1398
1399 extern {
1400     fn foo(s: SomeStruct); // ok!
1401 }
1402 // or
1403 extern {
1404     fn foo(a: (u32, u32)); // ok!
1405 }
1406 ```
1407 "##,
1408
1409 E0131: r##"
1410 It is not possible to define `main` with type parameters, or even with function
1411 parameters. When `main` is present, it must take no arguments and return `()`.
1412 "##,
1413
1414 E0132: r##"
1415 It is not possible to declare type parameters on a function that has the `start`
1416 attribute. Such a function must have the following type signature:
1417
1418 ```
1419 fn(isize, *const *const u8) -> isize
1420 ```
1421 "##,
1422
1423 E0159: r##"
1424 You tried to use a trait as a struct constructor. Erroneous code example:
1425
1426 ```
1427 trait TraitNotAStruct {}
1428
1429 TraitNotAStruct{ value: 0 }; // error: use of trait `TraitNotAStruct` as a
1430                              //        struct constructor
1431 ```
1432
1433 Please verify you used the correct type name or please implement the trait
1434 on a struct and use this struct constructor. Example:
1435
1436 ```
1437 trait TraitNotAStruct {}
1438
1439 struct Foo {
1440     value: i32
1441 }
1442
1443 Foo{ value: 0 }; // ok!
1444 ```
1445 "##,
1446
1447 E0166: r##"
1448 This error means that the compiler found a return expression in a function
1449 marked as diverging. A function diverges if it has `!` in the place of the
1450 return type in its signature. For example:
1451
1452 ```
1453 fn foo() -> ! { return; } // error
1454 ```
1455
1456 For a function that diverges, every control path in the function must never
1457 return, for example with a `loop` that never breaks or a call to another
1458 diverging function (such as `panic!()`).
1459 "##,
1460
1461 E0172: r##"
1462 This error means that an attempt was made to specify the type of a variable with
1463 a combination of a concrete type and a trait. Consider the following example:
1464
1465 ```
1466 fn foo(bar: i32+std::fmt::Display) {}
1467 ```
1468
1469 The code is trying to specify that we want to receive a signed 32-bit integer
1470 which also implements `Display`. This doesn't make sense: when we pass `i32`, a
1471 concrete type, it implicitly includes all of the traits that it implements.
1472 This includes `Display`, `Debug`, `Clone`, and a host of others.
1473
1474 If `i32` implements the trait we desire, there's no need to specify the trait
1475 separately. If it does not, then we need to `impl` the trait for `i32` before
1476 passing it into `foo`. Either way, a fixed definition for `foo` will look like
1477 the following:
1478
1479 ```
1480 fn foo(bar: i32) {}
1481 ```
1482
1483 To learn more about traits, take a look at the Book:
1484
1485 https://doc.rust-lang.org/book/traits.html
1486 "##,
1487
1488 E0178: r##"
1489 In types, the `+` type operator has low precedence, so it is often necessary
1490 to use parentheses.
1491
1492 For example:
1493
1494 ```
1495 trait Foo {}
1496
1497 struct Bar<'a> {
1498     w: &'a Foo + Copy,   // error, use &'a (Foo + Copy)
1499     x: &'a Foo + 'a,     // error, use &'a (Foo + 'a)
1500     y: &'a mut Foo + 'a, // error, use &'a mut (Foo + 'a)
1501     z: fn() -> Foo + 'a, // error, use fn() -> (Foo + 'a)
1502 }
1503 ```
1504
1505 More details can be found in [RFC 438].
1506
1507 [RFC 438]: https://github.com/rust-lang/rfcs/pull/438
1508 "##,
1509
1510 E0184: r##"
1511 Explicitly implementing both Drop and Copy for a type is currently disallowed.
1512 This feature can make some sense in theory, but the current implementation is
1513 incorrect and can lead to memory unsafety (see [issue #20126][iss20126]), so
1514 it has been disabled for now.
1515
1516 [iss20126]: https://github.com/rust-lang/rust/issues/20126
1517 "##,
1518
1519 E0185: r##"
1520 An associated function for a trait was defined to be static, but an
1521 implementation of the trait declared the same function to be a method (i.e. to
1522 take a `self` parameter).
1523
1524 Here's an example of this error:
1525
1526 ```
1527 trait Foo {
1528     fn foo();
1529 }
1530
1531 struct Bar;
1532
1533 impl Foo for Bar {
1534     // error, method `foo` has a `&self` declaration in the impl, but not in
1535     // the trait
1536     fn foo(&self) {}
1537 }
1538 "##,
1539
1540 E0186: r##"
1541 An associated function for a trait was defined to be a method (i.e. to take a
1542 `self` parameter), but an implementation of the trait declared the same function
1543 to be static.
1544
1545 Here's an example of this error:
1546
1547 ```
1548 trait Foo {
1549     fn foo(&self);
1550 }
1551
1552 struct Bar;
1553
1554 impl Foo for Bar {
1555     // error, method `foo` has a `&self` declaration in the trait, but not in
1556     // the impl
1557     fn foo() {}
1558 }
1559 ```
1560 "##,
1561
1562 E0191: r##"
1563 Trait objects need to have all associated types specified. Erroneous code
1564 example:
1565
1566 ```
1567 trait Trait {
1568     type Bar;
1569 }
1570
1571 type Foo = Trait; // error: the value of the associated type `Bar` (from
1572                   //        the trait `Trait`) must be specified
1573 ```
1574
1575 Please verify you specified all associated types of the trait and that you
1576 used the right trait. Example:
1577
1578 ```
1579 trait Trait {
1580     type Bar;
1581 }
1582
1583 type Foo = Trait<Bar=i32>; // ok!
1584 ```
1585 "##,
1586
1587 E0192: r##"
1588 Negative impls are only allowed for traits with default impls. For more
1589 information see the [opt-in builtin traits RFC](https://github.com/rust-lang/
1590 rfcs/blob/master/text/0019-opt-in-builtin-traits.md).
1591 "##,
1592
1593 E0195: r##"
1594 Your method's lifetime parameters do not match the trait declaration.
1595 Erroneous code example:
1596
1597 ```
1598 trait Trait {
1599     fn bar<'a,'b:'a>(x: &'a str, y: &'b str);
1600 }
1601
1602 struct Foo;
1603
1604 impl Trait for Foo {
1605     fn bar<'a,'b>(x: &'a str, y: &'b str) {
1606     // error: lifetime parameters or bounds on method `bar`
1607     // do not match the trait declaration
1608     }
1609 }
1610 ```
1611
1612 The lifetime constraint `'b` for bar() implementation does not match the
1613 trait declaration. Ensure lifetime declarations match exactly in both trait
1614 declaration and implementation. Example:
1615
1616 ```
1617 trait Trait {
1618     fn t<'a,'b:'a>(x: &'a str, y: &'b str);
1619 }
1620
1621 struct Foo;
1622
1623 impl Trait for Foo {
1624     fn t<'a,'b:'a>(x: &'a str, y: &'b str) { // ok!
1625     }
1626 }
1627 ```
1628 "##,
1629
1630 E0197: r##"
1631 Inherent implementations (one that do not implement a trait but provide
1632 methods associated with a type) are always safe because they are not
1633 implementing an unsafe trait. Removing the `unsafe` keyword from the inherent
1634 implementation will resolve this error.
1635
1636 ```
1637 struct Foo;
1638
1639 // this will cause this error
1640 unsafe impl Foo { }
1641 // converting it to this will fix it
1642 impl Foo { }
1643 ```
1644
1645 "##,
1646
1647 E0198: r##"
1648 A negative implementation is one that excludes a type from implementing a
1649 particular trait. Not being able to use a trait is always a safe operation,
1650 so negative implementations are always safe and never need to be marked as
1651 unsafe.
1652
1653 ```
1654 struct Foo;
1655
1656 // unsafe is unnecessary
1657 unsafe impl !Clone for Foo { }
1658 // this will compile
1659 impl !Clone for Foo { }
1660 ```
1661
1662 "##,
1663
1664 E0199: r##"
1665 Safe traits should not have unsafe implementations, therefore marking an
1666 implementation for a safe trait unsafe will cause a compiler error. Removing the
1667 unsafe marker on the trait noted in the error will resolve this problem.
1668
1669 ```
1670 struct Foo;
1671
1672 trait Bar { }
1673
1674 // this won't compile because Bar is safe
1675 unsafe impl Bar for Foo { }
1676 // this will compile
1677 impl Bar for Foo { }
1678 ```
1679
1680 "##,
1681
1682 E0200: r##"
1683 Unsafe traits must have unsafe implementations. This error occurs when an
1684 implementation for an unsafe trait isn't marked as unsafe. This may be resolved
1685 by marking the unsafe implementation as unsafe.
1686
1687 ```
1688 struct Foo;
1689
1690 unsafe trait Bar { }
1691
1692 // this won't compile because Bar is unsafe and impl isn't unsafe
1693 impl Bar for Foo { }
1694 // this will compile
1695 unsafe impl Bar for Foo { }
1696 ```
1697
1698 "##,
1699
1700 E0201: r##"
1701 It is an error to define two associated items (like methods, associated types,
1702 associated functions, etc.) with the same identifier.
1703
1704 For example:
1705
1706 ```
1707 struct Foo(u8);
1708
1709 impl Foo {
1710     fn bar(&self) -> bool { self.0 > 5 }
1711     fn bar() {} // error: duplicate associated function
1712 }
1713
1714 trait Baz {
1715     type Quux;
1716     fn baz(&self) -> bool;
1717 }
1718
1719 impl Baz for Foo {
1720     type Quux = u32;
1721
1722     fn baz(&self) -> bool { true }
1723
1724     // error: duplicate method
1725     fn baz(&self) -> bool { self.0 > 5 }
1726
1727     // error: duplicate associated type
1728     type Quux = u32;
1729 }
1730 ```
1731 "##,
1732
1733 E0202: r##"
1734 Inherent associated types were part of [RFC 195] but are not yet implemented.
1735 See [the tracking issue][iss8995] for the status of this implementation.
1736
1737 [RFC 195]: https://github.com/rust-lang/rfcs/pull/195
1738 [iss8995]: https://github.com/rust-lang/rust/issues/8995
1739 "##,
1740
1741 E0204: r##"
1742 An attempt to implement the `Copy` trait for a struct failed because one of the
1743 fields does not implement `Copy`. To fix this, you must implement `Copy` for the
1744 mentioned field. Note that this may not be possible, as in the example of
1745
1746 ```
1747 struct Foo {
1748     foo : Vec<u32>,
1749 }
1750
1751 impl Copy for Foo { }
1752 ```
1753
1754 This fails because `Vec<T>` does not implement `Copy` for any `T`.
1755
1756 Here's another example that will fail:
1757
1758 ```
1759 #[derive(Copy)]
1760 struct Foo<'a> {
1761     ty: &'a mut bool,
1762 }
1763 ```
1764
1765 This fails because `&mut T` is not `Copy`, even when `T` is `Copy` (this
1766 differs from the behavior for `&T`, which is always `Copy`).
1767 "##,
1768
1769 E0205: r##"
1770 An attempt to implement the `Copy` trait for an enum failed because one of the
1771 variants does not implement `Copy`. To fix this, you must implement `Copy` for
1772 the mentioned variant. Note that this may not be possible, as in the example of
1773
1774 ```
1775 enum Foo {
1776     Bar(Vec<u32>),
1777     Baz,
1778 }
1779
1780 impl Copy for Foo { }
1781 ```
1782
1783 This fails because `Vec<T>` does not implement `Copy` for any `T`.
1784
1785 Here's another example that will fail:
1786
1787 ```
1788 #[derive(Copy)]
1789 enum Foo<'a> {
1790     Bar(&'a mut bool),
1791     Baz
1792 }
1793 ```
1794
1795 This fails because `&mut T` is not `Copy`, even when `T` is `Copy` (this
1796 differs from the behavior for `&T`, which is always `Copy`).
1797 "##,
1798
1799 E0206: r##"
1800 You can only implement `Copy` for a struct or enum. Both of the following
1801 examples will fail, because neither `i32` (primitive type) nor `&'static Bar`
1802 (reference to `Bar`) is a struct or enum:
1803
1804 ```
1805 type Foo = i32;
1806 impl Copy for Foo { } // error
1807
1808 #[derive(Copy, Clone)]
1809 struct Bar;
1810 impl Copy for &'static Bar { } // error
1811 ```
1812 "##,
1813
1814 E0207: r##"
1815 You declared an unused type parameter when implementing a trait on an object.
1816 Erroneous code example:
1817
1818 ```
1819 trait MyTrait {
1820     fn get(&self) -> usize;
1821 }
1822
1823 struct Foo;
1824
1825 impl<T> MyTrait for Foo {
1826     fn get(&self) -> usize {
1827         0
1828     }
1829 }
1830 ```
1831
1832 Please check your object definition and remove unused type
1833 parameter(s). Example:
1834
1835 ```
1836 trait MyTrait {
1837     fn get(&self) -> usize;
1838 }
1839
1840 struct Foo;
1841
1842 impl MyTrait for Foo {
1843     fn get(&self) -> usize {
1844         0
1845     }
1846 }
1847 ```
1848 "##,
1849
1850 E0211: r##"
1851 You used an intrinsic function which doesn't correspond to its
1852 definition. Erroneous code example:
1853
1854 ```
1855 #![feature(intrinsics)]
1856
1857 extern "rust-intrinsic" {
1858     fn size_of<T>(); // error: intrinsic has wrong type
1859 }
1860 ```
1861
1862 Please check the function definition. Example:
1863
1864 ```
1865 #![feature(intrinsics)]
1866
1867 extern "rust-intrinsic" {
1868     fn size_of<T>() -> usize;
1869 }
1870 ```
1871 "##,
1872
1873 E0220: r##"
1874 You used an associated type which isn't defined in the trait.
1875 Erroneous code example:
1876
1877 ```
1878 trait Trait {
1879     type Bar;
1880 }
1881
1882 type Foo = Trait<F=i32>; // error: associated type `F` not found for
1883                          //        `Trait`
1884 ```
1885
1886 Please verify you used the right trait or you didn't misspell the
1887 associated type name. Example:
1888
1889 ```
1890 trait Trait {
1891     type Bar;
1892 }
1893
1894 type Foo = Trait<Bar=i32>; // ok!
1895 ```
1896 "##,
1897
1898 E0232: r##"
1899 The attribute must have a value. Erroneous code example:
1900
1901 ```
1902 #[rustc_on_unimplemented] // error: this attribute must have a value
1903 trait Bar {}
1904 ```
1905
1906 Please supply the missing value of the attribute. Example:
1907
1908 ```
1909 #[rustc_on_unimplemented = "foo"] // ok!
1910 trait Bar {}
1911 ```
1912 "##,
1913
1914 E0243: r##"
1915 This error indicates that not enough type parameters were found in a type or
1916 trait.
1917
1918 For example, the `Foo` struct below is defined to be generic in `T`, but the
1919 type parameter is missing in the definition of `Bar`:
1920
1921 ```
1922 struct Foo<T> { x: T }
1923
1924 struct Bar { x: Foo }
1925 ```
1926 "##,
1927
1928 E0244: r##"
1929 This error indicates that too many type parameters were found in a type or
1930 trait.
1931
1932 For example, the `Foo` struct below has no type parameters, but is supplied
1933 with two in the definition of `Bar`:
1934
1935 ```
1936 struct Foo { x: bool }
1937
1938 struct Bar<S, T> { x: Foo<S, T> }
1939 ```
1940 "##,
1941
1942 E0249: r##"
1943 This error indicates a constant expression for the array length was found, but
1944 it was not an integer (signed or unsigned) expression.
1945
1946 Some examples of code that produces this error are:
1947
1948 ```
1949 const A: [u32; "hello"] = []; // error
1950 const B: [u32; true] = []; // error
1951 const C: [u32; 0.0] = []; // error
1952 "##,
1953
1954 E0250: r##"
1955 There was an error while evaluating the expression for the length of a fixed-
1956 size array type.
1957
1958 Some examples of this error are:
1959
1960 ```
1961 // divide by zero in the length expression
1962 const A: [u32; 1/0] = [];
1963
1964 // Rust currently will not evaluate the function `foo` at compile time
1965 fn foo() -> usize { 12 }
1966 const B: [u32; foo()] = [];
1967
1968 // it is an error to try to add `u8` and `f64`
1969 use std::{f64, u8};
1970 const C: [u32; u8::MAX + f64::EPSILON] = [];
1971 ```
1972 "##,
1973
1974 E0318: r##"
1975 Default impls for a trait must be located in the same crate where the trait was
1976 defined. For more information see the [opt-in builtin traits RFC](https://github
1977 .com/rust-lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md).
1978 "##,
1979
1980 E0322: r##"
1981 The `Sized` trait is a special trait built-in to the compiler for types with a
1982 constant size known at compile-time. This trait is automatically implemented
1983 for types as needed by the compiler, and it is currently disallowed to
1984 explicitly implement it for a type.
1985 "##,
1986
1987 E0326: r##"
1988 The types of any associated constants in a trait implementation must match the
1989 types in the trait definition. This error indicates that there was a mismatch.
1990
1991 Here's an example of this error:
1992
1993 ```
1994 trait Foo {
1995     const BAR: bool;
1996 }
1997
1998 struct Bar;
1999
2000 impl Foo for Bar {
2001     const BAR: u32 = 5; // error, expected bool, found u32
2002 }
2003 ```
2004 "##,
2005
2006 E0327: r##"
2007 You cannot use associated items other than constant items as patterns. This
2008 includes method items. Example of erroneous code:
2009
2010 ```
2011 enum B {}
2012
2013 impl B {
2014     fn bb() -> i32 { 0 }
2015 }
2016
2017 fn main() {
2018     match 0 {
2019         B::bb => {} // error: associated items in match patterns must
2020                     // be constants
2021     }
2022 }
2023 ```
2024
2025 Please check that you're not using a method as a pattern. Example:
2026
2027 ```
2028 enum B {
2029     ba,
2030     bb
2031 }
2032
2033 fn main() {
2034     match B::ba {
2035         B::bb => {} // ok!
2036         _ => {}
2037     }
2038 }
2039 ```
2040 "##,
2041
2042 E0368: r##"
2043 This error indicates that a binary assignment operator like `+=` or `^=` was
2044 applied to the wrong types. For example:
2045
2046 ```
2047 let mut x: u16 = 5;
2048 x ^= true; // error, `^=` cannot be applied to types `u16` and `bool`
2049 x += ();   // error, `+=` cannot be applied to types `u16` and `()`
2050 ```
2051
2052 Another problem you might be facing is this: suppose you've overloaded the `+`
2053 operator for some type `Foo` by implementing the `std::ops::Add` trait for
2054 `Foo`, but you find that using `+=` does not work, as in this example:
2055
2056 ```
2057 use std::ops::Add;
2058
2059 struct Foo(u32);
2060
2061 impl Add for Foo {
2062     type Output = Foo;
2063
2064     fn add(self, rhs: Foo) -> Foo {
2065         Foo(self.0 + rhs.0)
2066     }
2067 }
2068
2069 fn main() {
2070     let mut x: Foo = Foo(5);
2071     x += Foo(7); // error, `+= cannot be applied to types `Foo` and `Foo`
2072 }
2073 ```
2074
2075 This is because the binary assignment operators currently do not work off of
2076 traits, so it is not possible to overload them. See [RFC 953] for a proposal
2077 to change this.
2078
2079 [RFC 953]: https://github.com/rust-lang/rfcs/pull/953
2080 "##,
2081
2082 E0371: r##"
2083 When `Trait2` is a subtrait of `Trait1` (for example, when `Trait2` has a
2084 definition like `trait Trait2: Trait1 { ... }`), it is not allowed to implement
2085 `Trait1` for `Trait2`. This is because `Trait2` already implements `Trait1` by
2086 definition, so it is not useful to do this.
2087
2088 Example:
2089
2090 ```
2091 trait Foo { fn foo(&self) { } }
2092 trait Bar: Foo { }
2093 trait Baz: Bar { }
2094
2095 impl Bar for Baz { } // error, `Baz` implements `Bar` by definition
2096 impl Foo for Baz { } // error, `Baz` implements `Bar` which implements `Foo`
2097 impl Baz for Baz { } // error, `Baz` (trivially) implements `Baz`
2098 impl Baz for Bar { } // Note: This is OK
2099 ```
2100 "##,
2101
2102 E0372: r##"
2103 Trying to implement a trait for a trait object (as in `impl Trait1 for
2104 Trait2 { ... }`) does not work if the trait is not object-safe. Please see the
2105 [RFC 255] for more details on object safety rules.
2106
2107 [RFC 255]: https://github.com/rust-lang/rfcs/pull/255
2108 "##,
2109
2110 E0379: r##"
2111 Trait methods cannot be declared `const` by design. For more information, see
2112 [RFC 911].
2113
2114 [RFC 911]: https://github.com/rust-lang/rfcs/pull/911
2115 "##,
2116
2117 E0380: r##"
2118 Default impls are only allowed for traits with no methods or associated items.
2119 For more information see the [opt-in builtin traits RFC](https://github.com/rust
2120 -lang/rfcs/blob/master/text/0019-opt-in-builtin-traits.md).
2121 "##,
2122
2123 E0392: r##"
2124 This error indicates that a type or lifetime parameter has been declared
2125 but not actually used.  Here is an example that demonstrates the error:
2126
2127 ```
2128 enum Foo<T> {
2129     Bar
2130 }
2131 ```
2132
2133 If the type parameter was included by mistake, this error can be fixed
2134 by simply removing the type parameter, as shown below:
2135
2136 ```
2137 enum Foo {
2138     Bar
2139 }
2140 ```
2141
2142 Alternatively, if the type parameter was intentionally inserted, it must be
2143 used. A simple fix is shown below:
2144
2145 ```
2146 enum Foo<T> {
2147     Bar(T)
2148 }
2149 ```
2150
2151 This error may also commonly be found when working with unsafe code. For
2152 example, when using raw pointers one may wish to specify the lifetime for
2153 which the pointed-at data is valid. An initial attempt (below) causes this
2154 error:
2155
2156 ```
2157 struct Foo<'a, T> {
2158     x: *const T
2159 }
2160 ```
2161
2162 We want to express the constraint that Foo should not outlive `'a`, because
2163 the data pointed to by `T` is only valid for that lifetime. The problem is
2164 that there are no actual uses of `'a`. It's possible to work around this
2165 by adding a PhantomData type to the struct, using it to tell the compiler
2166 to act as if the struct contained a borrowed reference `&'a T`:
2167
2168 ```
2169 use std::marker::PhantomData;
2170
2171 struct Foo<'a, T: 'a> {
2172     x: *const T,
2173     phantom: PhantomData<&'a T>
2174 }
2175 ```
2176
2177 PhantomData can also be used to express information about unused type
2178 parameters. You can read more about it in the API documentation:
2179
2180 https://doc.rust-lang.org/std/marker/struct.PhantomData.html
2181 "##
2182
2183 }
2184
2185 register_diagnostics! {
2186     E0068,
2187     E0074,
2188     E0075,
2189     E0076,
2190     E0077,
2191     E0085,
2192     E0086,
2193     E0090,
2194     E0102,
2195     E0103,
2196     E0104,
2197     E0118,
2198     E0120,
2199     E0122,
2200     E0123,
2201     E0127,
2202     E0129,
2203     E0141,
2204     E0163,
2205     E0164,
2206     E0167,
2207     E0168,
2208     E0173, // manual implementations of unboxed closure traits are experimental
2209     E0174, // explicit use of unboxed closure methods are experimental
2210     E0182,
2211     E0183,
2212     E0187, // can't infer the kind of the closure
2213     E0188, // can not cast a immutable reference to a mutable pointer
2214     E0189, // deprecated: can only cast a boxed pointer to a boxed object
2215     E0190, // deprecated: can only cast a &-pointer to an &-object
2216     E0193, // cannot bound type where clause bounds may only be attached to types
2217            // involving type parameters
2218     E0194,
2219     E0196, // cannot determine a type for this closure
2220     E0203, // type parameter has more than one relaxed default bound,
2221            // and only one is supported
2222     E0208,
2223     E0209, // builtin traits can only be implemented on structs or enums
2224     E0210, // type parameter is not constrained by any local type
2225     E0212, // cannot extract an associated type from a higher-ranked trait bound
2226     E0213, // associated types are not accepted in this context
2227     E0214, // parenthesized parameters may only be used with a trait
2228     E0215, // angle-bracket notation is not stable with `Fn`
2229     E0216, // parenthetical notation is only stable with `Fn`
2230     E0217, // ambiguous associated type, defined in multiple supertraits
2231     E0218, // no associated type defined
2232     E0219, // associated type defined in higher-ranked supertrait
2233     E0221, // ambiguous associated type in bounds
2234     //E0222, // Error code E0045 (variadic function must have C calling
2235              // convention) duplicate
2236     E0223, // ambiguous associated type
2237     E0224, // at least one non-builtin train is required for an object type
2238     E0225, // only the builtin traits can be used as closure or object bounds
2239     E0226, // only a single explicit lifetime bound is permitted
2240     E0227, // ambiguous lifetime bound, explicit lifetime bound required
2241     E0228, // explicit lifetime bound required
2242     E0229, // associated type bindings are not allowed here
2243     E0230, // there is no type parameter on trait
2244     E0231, // only named substitution parameters are allowed
2245     E0233,
2246     E0234,
2247     E0235, // structure constructor specifies a structure of type but
2248     E0236, // no lang item for range syntax
2249     E0237, // no lang item for range syntax
2250     E0238, // parenthesized parameters may only be used with a trait
2251     E0239, // `next` method of `Iterator` trait has unexpected type
2252     E0240,
2253     E0241,
2254     E0242, // internal error looking up a definition
2255     E0245, // not a trait
2256     E0246, // illegal recursive type
2257     E0247, // found module name used as a type
2258     E0248, // found value name used as a type
2259     E0319, // trait impls for defaulted traits allowed just for structs/enums
2260     E0320, // recursive overflow during dropck
2261     E0321, // extended coherence rules for defaulted traits violated
2262     E0323, // implemented an associated const when another trait item expected
2263     E0324, // implemented a method when another trait item expected
2264     E0325, // implemented an associated type when another trait item expected
2265     E0328, // cannot implement Unsize explicitly
2266     E0329, // associated const depends on type parameter or Self.
2267     E0366, // dropck forbid specialization to concrete type or region
2268     E0367, // dropck forbid specialization to predicate not in struct/enum
2269     E0369, // binary operation `<op>` cannot be applied to types
2270     E0374, // the trait `CoerceUnsized` may only be implemented for a coercion
2271            // between structures with one field being coerced, none found
2272     E0375, // the trait `CoerceUnsized` may only be implemented for a coercion
2273            // between structures with one field being coerced, but multiple
2274            // fields need coercions
2275     E0376, // the trait `CoerceUnsized` may only be implemented for a coercion
2276            // between structures
2277     E0377, // the trait `CoerceUnsized` may only be implemented for a coercion
2278            // between structures with the same definition
2279     E0390, // only a single inherent implementation marked with
2280            // `#[lang = \"{}\"]` is allowed for the `{}` primitive
2281     E0391, // unsupported cyclic reference between types/traits detected
2282     E0393, // the type parameter `{}` must be explicitly specified in an object
2283            // type because its default value `{}` references the type `Self`"
2284     E0399, // trait items need to be implemented because the associated
2285            // type `{}` was overridden
2286     E0436  // functional record update requires a struct
2287 }