Rollup merge of #61220 - imbrem:error_explanations, r=estebank

Added error message for E0284

Work on #61137
This commit is contained in:
Mazdak Farrokhzad 2019-05-28 11:48:55 +02:00 committed by GitHub
commit 3b5157917a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 49 additions and 1 deletions

View file

@ -1207,6 +1207,51 @@ fn main() {
```
"##,
E0284: r##"
This error occurs when the compiler is unable to unambiguously infer the
return type of a function or method which is generic on return type, such
as the `collect` method for `Iterator`s.
For example:
```compile_fail,E0284
fn foo() -> Result<bool, ()> {
let results = [Ok(true), Ok(false), Err(())].iter().cloned();
let v: Vec<bool> = results.collect()?;
// Do things with v...
Ok(true)
}
```
Here we have an iterator `results` over `Result<bool, ()>`.
Hence, `results.collect()` can return any type implementing
`FromIterator<Result<bool, ()>>`. On the other hand, the
`?` operator can accept any type implementing `Try`.
The author of this code probably wants `collect()` to return a
`Result<Vec<bool>, ()>`, but the compiler can't be sure
that there isn't another type `T` implementing both `Try` and
`FromIterator<Result<bool, ()>>` in scope such that
`T::Ok == Vec<bool>`. Hence, this code is ambiguous and an error
is returned.
To resolve this error, use a concrete type for the intermediate expression:
```
fn foo() -> Result<bool, ()> {
let results = [Ok(true), Ok(false), Err(())].iter().cloned();
let v = {
let temp: Result<Vec<bool>, ()> = results.collect();
temp?
};
// Do things with v...
Ok(true)
}
```
Note that the type of `v` can now be inferred from the type of `temp`.
"##,
E0308: r##"
This error occurs when the compiler was unable to infer the concrete type of a
variable. It can occur for several cases, the most common of which is a
@ -2158,7 +2203,6 @@ register_diagnostics! {
E0278, // requirement is not satisfied
E0279, // requirement is not satisfied
E0280, // requirement is not satisfied
E0284, // cannot resolve type
// E0285, // overflow evaluation builtin bounds
// E0296, // replaced with a generic attribute input check
// E0300, // unexpanded macro

View file

@ -12,3 +12,4 @@ LL | trait Foo: Iterator<Item = i32> {}
error: aborting due to previous error
For more information about this error, try `rustc --explain E0284`.

View file

@ -6,3 +6,4 @@ LL | let x: isize = Foo::bar();
error: aborting due to previous error
For more information about this error, try `rustc --explain E0284`.

View file

@ -6,3 +6,4 @@ LL | self.input_stream(&mut stream);
error: aborting due to previous error
For more information about this error, try `rustc --explain E0284`.

View file

@ -6,3 +6,4 @@ LL | l.iter().map(f).collect()?
error: aborting due to previous error
For more information about this error, try `rustc --explain E0284`.