diff options
| author | Steve Klabnik <steve@steveklabnik.com> | 2015-05-07 12:21:01 +0200 |
|---|---|---|
| committer | Steve Klabnik <steve@steveklabnik.com> | 2015-05-07 12:21:01 +0200 |
| commit | 74d24ad6afc03476c671657ada598450e9a178b9 (patch) | |
| tree | 3d7a9d5e82b8de8898308c7ff364b93e96a26156 | |
| parent | 52174305a0d8c8fcaa87756de4049ade4b8d097b (diff) | |
| parent | 4b8098bb193d82d18183a8223507f5908adeeb4c (diff) | |
| download | rust-74d24ad6afc03476c671657ada598450e9a178b9.tar.gz rust-74d24ad6afc03476c671657ada598450e9a178b9.zip | |
Rollup merge of #24966 - ruud-v-a:explain, r=pnkfelix
The error message was misleading, so I adjusted it, and I also added the long diagnostics for this error (resolves one point in #24407). I was unsure about how to phrase the error message. Is “generic parameter binding” the correct term for this?
| -rw-r--r-- | src/librustc/diagnostics.rs | 69 | ||||
| -rw-r--r-- | src/librustc/middle/traits/error_reporting.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-12187-1.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-12187-2.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-5062.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-6458-2.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-6458-3.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-6458-4.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-6458.rs | 5 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-7813.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/method-ambig-one-trait-unknown-int-type.rs | 5 | ||||
| -rw-r--r-- | src/test/compile-fail/traits-multidispatch-convert-ambig-dest.rs | 5 | ||||
| -rw-r--r-- | src/test/compile-fail/unconstrained-none.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/unconstrained-ref.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/vector-no-ann.rs | 5 |
15 files changed, 99 insertions, 28 deletions
diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index ff2e1135dea..88112b4b90c 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -419,6 +419,74 @@ of a loop. Without a loop to break out of or continue in, no sensible action can be taken. "##, +E0282: r##" +This error indicates that type inference did not result in one unique possible +type, and extra information is required. In most cases this can be provided +by adding a type annotation. Sometimes you need to specify a generic type +parameter manually. + +A common example is the `collect` method on `Iterator`. It has a generic type +parameter with a `FromIterator` bound, which for a `char` iterator is +implemented by `Vec` and `String` among others. Consider the following snippet +that reverses the characters of a string: + +``` +let x = "hello".chars().rev().collect(); +``` + +In this case, the compiler cannot infer what the type of `x` should be: +`Vec<char>` and `String` are both suitable candidates. To specify which type to +use, you can use a type annotation on `x`: + +``` +let x: Vec<char> = "hello".chars().rev().collect(); +``` + +It is not necessary to annotate the full type. Once the ambiguity is resolved, +the compiler can infer the rest: + +``` +let x: Vec<_> = "hello".chars().rev().collect(); +``` + +Another way to provide the compiler with enough information, is to specify the +generic type parameter: + +``` +let x = "hello".chars().rev().collect::<Vec<char>>(); +``` + +Again, you need not specify the full type if the compiler can infer it: + +``` +let x = "hello".chars().rev().collect::<Vec<_>>(); +``` + +Apart from a method or function with a generic type parameter, this error can +occur when a type parameter of a struct or trait cannot be inferred. In that +case it is not always possible to use a type annotation, because all candidates +have the same return type. For instance: + +``` +struct Foo<T> { + // Some fields omitted. +} + +impl<T> Foo<T> { + fn bar() -> i32 { + 0 + } + + fn baz() { + let number = Foo::bar(); + } +} +``` + +This will fail because the compiler does not know which instance of `Foo` to +call `bar` on. Change `Foo::bar()` to `Foo::<T>::bar()` to resolve the error. +"##, + E0296: r##" This error indicates that the given recursion limit could not be parsed. Ensure that the value provided is a positive integer between quotes, like so: @@ -617,7 +685,6 @@ register_diagnostics! { E0279, // requirement is not satisfied E0280, // requirement is not satisfied E0281, // type implements trait but other trait is required - E0282, // unable to infer enough type information about E0283, // cannot resolve type E0284, // cannot resolve type E0285, // overflow evaluation builtin bounds diff --git a/src/librustc/middle/traits/error_reporting.rs b/src/librustc/middle/traits/error_reporting.rs index 1b5719d3d42..c2c4d60a4ff 100644 --- a/src/librustc/middle/traits/error_reporting.rs +++ b/src/librustc/middle/traits/error_reporting.rs @@ -290,7 +290,7 @@ pub fn maybe_report_ambiguity<'a, 'tcx>(infcx: &InferCtxt<'a, 'tcx>, { span_err!(infcx.tcx.sess, obligation.cause.span, E0282, "unable to infer enough type information about `{}`; \ - type annotations required", + type annotations or generic parameter binding required", self_ty.user_string(infcx.tcx)); } else { span_err!(infcx.tcx.sess, obligation.cause.span, E0283, diff --git a/src/test/compile-fail/issue-12187-1.rs b/src/test/compile-fail/issue-12187-1.rs index 74423b041dd..5322966ae2e 100644 --- a/src/test/compile-fail/issue-12187-1.rs +++ b/src/test/compile-fail/issue-12187-1.rs @@ -1,4 +1,4 @@ -// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -14,5 +14,5 @@ fn new<T>() -> &'static T { fn main() { let &v = new(); - //~^ ERROR type annotations required + //~^ ERROR type annotations or generic parameter binding required } diff --git a/src/test/compile-fail/issue-12187-2.rs b/src/test/compile-fail/issue-12187-2.rs index af5c8b45a48..dabc0acba37 100644 --- a/src/test/compile-fail/issue-12187-2.rs +++ b/src/test/compile-fail/issue-12187-2.rs @@ -1,4 +1,4 @@ -// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -14,5 +14,5 @@ fn new<'r, T>() -> &'r T { fn main() { let &v = new(); - //~^ ERROR type annotations required + //~^ ERROR type annotations or generic parameter binding required } diff --git a/src/test/compile-fail/issue-5062.rs b/src/test/compile-fail/issue-5062.rs index 7bf3449a664..392d38a6144 100644 --- a/src/test/compile-fail/issue-5062.rs +++ b/src/test/compile-fail/issue-5062.rs @@ -1,4 +1,4 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -9,4 +9,4 @@ // except according to those terms. fn main() { format!("{:?}", None); } - //~^ ERROR type annotations required + //~^ ERROR type annotations or generic parameter binding required diff --git a/src/test/compile-fail/issue-6458-2.rs b/src/test/compile-fail/issue-6458-2.rs index 0143c75bfc6..acf1d766b6a 100644 --- a/src/test/compile-fail/issue-6458-2.rs +++ b/src/test/compile-fail/issue-6458-2.rs @@ -1,4 +1,4 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -11,5 +11,5 @@ fn main() { // Unconstrained type: format!("{:?}", None); - //~^ ERROR type annotations required + //~^ ERROR type annotations or generic parameter binding required } diff --git a/src/test/compile-fail/issue-6458-3.rs b/src/test/compile-fail/issue-6458-3.rs index f96faeeec4b..3f81e51efe2 100644 --- a/src/test/compile-fail/issue-6458-3.rs +++ b/src/test/compile-fail/issue-6458-3.rs @@ -1,4 +1,4 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -12,5 +12,5 @@ use std::mem; fn main() { mem::transmute(0); - //~^ ERROR type annotations required + //~^ ERROR type annotations or generic parameter binding required } diff --git a/src/test/compile-fail/issue-6458-4.rs b/src/test/compile-fail/issue-6458-4.rs index 02274e5441e..7f408be9c02 100644 --- a/src/test/compile-fail/issue-6458-4.rs +++ b/src/test/compile-fail/issue-6458-4.rs @@ -1,4 +1,4 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -10,7 +10,7 @@ fn foo(b: bool) -> Result<bool,String> { Err("bar".to_string()); - //~^ ERROR type annotations required + //~^ ERROR type annotations or generic parameter binding required } fn main() { diff --git a/src/test/compile-fail/issue-6458.rs b/src/test/compile-fail/issue-6458.rs index 0bf9a3c2d48..c1f9dd6a4b8 100644 --- a/src/test/compile-fail/issue-6458.rs +++ b/src/test/compile-fail/issue-6458.rs @@ -1,4 +1,4 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -16,7 +16,8 @@ pub struct MyState; pub fn foo<State>(_: TypeWithState<State>) {} pub fn bar() { - foo(TypeWithState(marker::PhantomData)); //~ ERROR type annotations required + foo(TypeWithState(marker::PhantomData)); + //~^ ERROR type annotations or generic parameter binding required } fn main() { diff --git a/src/test/compile-fail/issue-7813.rs b/src/test/compile-fail/issue-7813.rs index 81421af4fa8..327fb6adf1d 100644 --- a/src/test/compile-fail/issue-7813.rs +++ b/src/test/compile-fail/issue-7813.rs @@ -1,4 +1,4 @@ -// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -10,5 +10,5 @@ fn main() { let v = &[]; - let it = v.iter(); //~ ERROR type annotations required + let it = v.iter(); //~ ERROR type annotations or generic parameter binding required } diff --git a/src/test/compile-fail/method-ambig-one-trait-unknown-int-type.rs b/src/test/compile-fail/method-ambig-one-trait-unknown-int-type.rs index c6d45f1c9db..59d75c5a787 100644 --- a/src/test/compile-fail/method-ambig-one-trait-unknown-int-type.rs +++ b/src/test/compile-fail/method-ambig-one-trait-unknown-int-type.rs @@ -1,4 +1,4 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -31,7 +31,8 @@ impl foo for Vec<isize> { fn m1() { // we couldn't infer the type of the vector just based on calling foo()... - let mut x = Vec::new(); //~ ERROR type annotations required + let mut x = Vec::new(); + //~^ ERROR type annotations or generic parameter binding required x.foo(); } diff --git a/src/test/compile-fail/traits-multidispatch-convert-ambig-dest.rs b/src/test/compile-fail/traits-multidispatch-convert-ambig-dest.rs index 8fe1f4d2371..c77494912bc 100644 --- a/src/test/compile-fail/traits-multidispatch-convert-ambig-dest.rs +++ b/src/test/compile-fail/traits-multidispatch-convert-ambig-dest.rs @@ -1,4 +1,4 @@ -// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -33,7 +33,8 @@ where T : Convert<U> } fn a() { - test(22, std::default::Default::default()); //~ ERROR type annotations required + test(22, std::default::Default::default()); + //~^ ERROR type annotations or generic parameter binding required } fn main() {} diff --git a/src/test/compile-fail/unconstrained-none.rs b/src/test/compile-fail/unconstrained-none.rs index 9879766a8fa..c14de98e03f 100644 --- a/src/test/compile-fail/unconstrained-none.rs +++ b/src/test/compile-fail/unconstrained-none.rs @@ -1,4 +1,4 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -11,5 +11,5 @@ // Issue #5062 fn main() { - None; //~ ERROR type annotations required + None; //~ ERROR type annotations or generic parameter binding required } diff --git a/src/test/compile-fail/unconstrained-ref.rs b/src/test/compile-fail/unconstrained-ref.rs index e03f60e758c..02a3f2b9ab8 100644 --- a/src/test/compile-fail/unconstrained-ref.rs +++ b/src/test/compile-fail/unconstrained-ref.rs @@ -1,4 +1,4 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -13,5 +13,5 @@ struct S<'a, T:'a> { } fn main() { - S { o: &None }; //~ ERROR type annotations required + S { o: &None }; //~ ERROR type annotations or generic parameter binding required } diff --git a/src/test/compile-fail/vector-no-ann.rs b/src/test/compile-fail/vector-no-ann.rs index d48f5715ec1..419b8c4e1b0 100644 --- a/src/test/compile-fail/vector-no-ann.rs +++ b/src/test/compile-fail/vector-no-ann.rs @@ -1,4 +1,4 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -10,5 +10,6 @@ fn main() { - let _foo = Vec::new(); //~ ERROR type annotations required + let _foo = Vec::new(); + //~^ ERROR type annotations or generic parameter binding required } |
