diff --git a/src/librustc/error_codes.rs b/src/librustc/error_codes.rs index a1bfd417566..ef4d13096ba 100644 --- a/src/librustc/error_codes.rs +++ b/src/librustc/error_codes.rs @@ -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 { + let results = [Ok(true), Ok(false), Err(())].iter().cloned(); + let v : Vec = results.collect()?; + // Do things with v... + Ok(true) +} +``` + +Here we have an iterator `results` over `Result`. +Hence, `results.collect()` can return any type implementing +`FromIterator>`. On the other hand, the +`?` operator can accept any type implementing `Try`. + +The user of this code probably wants `collect()` to return a +`Result, ()>`, but the compiler can't be sure +that there isn't another type `T` implementing both `Try` and +`FromIterator>` in scope such that +`T::Ok == Vec`. 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 { + let results = [Ok(true), Ok(false), Err(())].iter().cloned(); + let v = { + let temp : Result, ()> = 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 +2204,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