Skip to content

Commit

Permalink
Improve long error explanations for E0620 and E0621
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeGomez committed Jun 29, 2017
1 parent ff0fb9d commit 5acc1de
Showing 1 changed file with 30 additions and 16 deletions.
46 changes: 30 additions & 16 deletions src/librustc_typeck/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4666,28 +4666,41 @@ i_am_a_function();
"##,

E0619: r##"
A not (yet) known type was used.
The type-checker needed to know the type of an expression, but that type had not
yet been inferred.
Erroneous code example:
```compile_fail,E0619
let x;
match x {
(..) => {} // error: the type of this value must be known in this context
_ => {}
let mut x = vec![];
match x.pop() {
Some(v) => {
// Here, the type of `v` is not (yet) known, so we
// cannot resolve this method call:
v.to_uppercase(); // error: the type of this value must be known in
// this context
}
None => {}
}
```
Type inference typically proceeds from the top of the function to the bottom,
figuring out types as it goes. In some cases -- notably method calls and
overloadable operators like `*` -- the type checker may not have enough
information *yet* to make progress. This can be true even if the rest of the
function provides enough context (because the type-checker hasn't looked that
far ahead yet). In this case, type annotations can be used to help it along.
To fix this error, just specify the type of the variable. Example:
```
let x: i32 = 0; // Here, we say that `x` is an `i32` (and give it a value to
// avoid another compiler error).
match x {
0 => {} // ok!
_ => {}
let mut x: Vec<String> = vec![]; // We precise the type of the vec elements.
match x.pop() {
Some(v) => {
v.to_uppercase(); // Since rustc now knows the type of the vec elements,
// we can use `v`'s methods.
}
None => {}
}
```
"##,
Expand All @@ -4702,9 +4715,11 @@ let x = &[1_usize, 2] as [usize]; // error: cast to unsized type: `&[usize; 2]`
// as `[usize]`
```
In Rust, some types don't have a size at compile-time (like slices and traits
for example). Therefore, you can't cast into them directly. Try casting to a
reference instead:
In Rust, some types don't have a known size at compile-time. For example, in a
slice type like `[u32]`, the number of elements is not known at compile-time and
hence the overall size cannot be computed. As a result, such types can only be
manipulated through a reference (e.g., `&T` or `&mut T`) or other pointer-type
(e.g., `Box` or `Rc`). Try casting to a reference instead:
```
let x = &[1_usize, 2] as &[usize]; // ok!
Expand Down Expand Up @@ -4782,5 +4797,4 @@ register_diagnostics! {
E0568, // auto-traits can not have predicates,
E0588, // packed struct cannot transitively contain a `[repr(align)]` struct
E0592, // duplicate definitions with name `{}`
E0619, // intrinsic must be a function
}

0 comments on commit 5acc1de

Please sign in to comment.