Added error message for E0284
This commit is contained in:
parent
dc6db14e1c
commit
03cce1d81e
|
@ -1207,6 +1207,52 @@ 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 user 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##"
|
E0308: r##"
|
||||||
This error occurs when the compiler was unable to infer the concrete type of a
|
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
|
variable. It can occur for several cases, the most common of which is a
|
||||||
|
@ -2158,7 +2204,6 @@ register_diagnostics! {
|
||||||
E0278, // requirement is not satisfied
|
E0278, // requirement is not satisfied
|
||||||
E0279, // requirement is not satisfied
|
E0279, // requirement is not satisfied
|
||||||
E0280, // requirement is not satisfied
|
E0280, // requirement is not satisfied
|
||||||
E0284, // cannot resolve type
|
|
||||||
// E0285, // overflow evaluation builtin bounds
|
// E0285, // overflow evaluation builtin bounds
|
||||||
// E0296, // replaced with a generic attribute input check
|
// E0296, // replaced with a generic attribute input check
|
||||||
// E0300, // unexpanded macro
|
// E0300, // unexpanded macro
|
||||||
|
|
Loading…
Reference in New Issue