diff options
| author | bors <bors@rust-lang.org> | 2014-10-31 11:16:44 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-10-31 11:16:44 +0000 |
| commit | 82045ca3606dfe070fce99ca71fb6a9d39217b73 (patch) | |
| tree | b2cb83f5450837190f250d111177c4f752bef35b /src/test | |
| parent | 065caf34f5ff29e04605f95d9c5d511af219439a (diff) | |
| parent | a2624fc90891b8265550229e38bc255e61a9d335 (diff) | |
| download | rust-82045ca3606dfe070fce99ca71fb6a9d39217b73.tar.gz rust-82045ca3606dfe070fce99ca71fb6a9d39217b73.zip | |
auto merge of #18264 : jakub-/rust/var-ids-in-error-messages, r=nikomatsakis
This PR aims to improve the readability of diagnostic messages that involve unresolved type variables. Currently, messages like the following:
```rust
mismatched types: expected `core::result::Result<uint,()>`, found `core::option::Option<<generic #1>>`
<anon>:6 let a: Result<uint, ()> = None;
^~~~
mismatched types: expected `&mut <generic #2>`, found `uint`
<anon>:7 f(42u);
^~~
```
tend to appear unapproachable to new users. [0] While specific type var IDs are valuable in
diagnostics that deal with more than one such variable, in practice many messages
only mention one. In those cases, leaving out the specific number makes the messages
slightly less terrifying.
```rust
mismatched types: expected `core::result::Result<uint, ()>`, found `core::option::Option<_>`
<anon>:6 let a: Result<uint, ()> = None;
^~~~
mismatched types: expected `&mut _`, found `uint`
<anon>:7 f(42u);
^~~
```
As you can see, I also tweaked the aesthetics slightly by changing type variables to use the type hole syntax _. For integer variables, the syntax used is:
```rust
mismatched types: expected `core::result::Result<uint, ()>`, found `core::option::Option<_#1i>`
<anon>:6 let a: Result<uint, ()> = Some(1);
```
and float variables:
```rust
mismatched types: expected `core::result::Result<uint, ()>`, found `core::option::Option<_#1f>`
<anon>:6 let a: Result<uint, ()> = Some(0.5);
```
[0] https://twitter.com/coda/status/517713085465772032
Closes https://github.com/rust-lang/rust/issues/2632.
Closes https://github.com/rust-lang/rust/issues/3404.
Closes https://github.com/rust-lang/rust/issues/18426.
Diffstat (limited to 'src/test')
24 files changed, 83 insertions, 41 deletions
diff --git a/src/test/compile-fail/array-not-vector.rs b/src/test/compile-fail/array-not-vector.rs index 79d4ada41e8..7edb4b8754a 100644 --- a/src/test/compile-fail/array-not-vector.rs +++ b/src/test/compile-fail/array-not-vector.rs @@ -9,8 +9,8 @@ // except according to those terms. fn main() { - let _x: int = [1i, 2, 3]; //~ ERROR expected int, found array + let _x: int = [1i, 2, 3]; //~ ERROR expected int, found array of 3 elements let x: &[int] = &[1, 2, 3]; - let _y: &int = x; //~ ERROR expected int, found unsized array + let _y: &int = x; //~ ERROR expected int, found slice } diff --git a/src/test/compile-fail/explicit-self-lifetime-mismatch.rs b/src/test/compile-fail/explicit-self-lifetime-mismatch.rs index b5346a1c5d1..d1ae535d830 100644 --- a/src/test/compile-fail/explicit-self-lifetime-mismatch.rs +++ b/src/test/compile-fail/explicit-self-lifetime-mismatch.rs @@ -16,10 +16,10 @@ struct Foo<'a,'b> { impl<'a,'b> Foo<'a,'b> { // The number of errors is related to the way invariance works. fn bar(self: Foo<'b,'a>) {} - //~^ ERROR mismatched types: expected `Foo<'a,'b>`, found `Foo<'b,'a>` - //~^^ ERROR mismatched types: expected `Foo<'a,'b>`, found `Foo<'b,'a>` - //~^^^ ERROR mismatched types: expected `Foo<'b,'a>`, found `Foo<'a,'b>` - //~^^^^ ERROR mismatched types: expected `Foo<'b,'a>`, found `Foo<'a,'b>` + //~^ ERROR mismatched types: expected `Foo<'a, 'b>`, found `Foo<'b, 'a>` + //~^^ ERROR mismatched types: expected `Foo<'a, 'b>`, found `Foo<'b, 'a>` + //~^^^ ERROR mismatched types: expected `Foo<'b, 'a>`, found `Foo<'a, 'b>` + //~^^^^ ERROR mismatched types: expected `Foo<'b, 'a>`, found `Foo<'a, 'b>` } fn main() {} diff --git a/src/test/compile-fail/generic-type-params-name-repr.rs b/src/test/compile-fail/generic-type-params-name-repr.rs index 87c865ab618..1c14644ec18 100644 --- a/src/test/compile-fail/generic-type-params-name-repr.rs +++ b/src/test/compile-fail/generic-type-params-name-repr.rs @@ -29,13 +29,13 @@ fn main() { // Including cases where the default is using previous type params. let _: HashMap<String, int> = (); - //~^ ERROR mismatched types: expected `HashMap<collections::string::String,int>`, found `()` + //~^ ERROR mismatched types: expected `HashMap<collections::string::String, int>`, found `()` let _: HashMap<String, int, Hash<String>> = (); - //~^ ERROR mismatched types: expected `HashMap<collections::string::String,int>`, found `()` + //~^ ERROR mismatched types: expected `HashMap<collections::string::String, int>`, found `()` // But not when there's a different type in between. let _: Foo<A, int, C> = (); - //~^ ERROR mismatched types: expected `Foo<A,int>`, found `()` + //~^ ERROR mismatched types: expected `Foo<A, int>`, found `()` // And don't print <> at all when there's just defaults. let _: Foo<A, B, C> = (); diff --git a/src/test/compile-fail/integral-variable-unification-error.rs b/src/test/compile-fail/integral-variable-unification-error.rs new file mode 100644 index 00000000000..fbbe4cf8dbc --- /dev/null +++ b/src/test/compile-fail/integral-variable-unification-error.rs @@ -0,0 +1,15 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let mut x = 2; + x = 5.0; +//~^ ERROR expected `_`, found `_` (expected integral variable, found floating-point variable) +} diff --git a/src/test/compile-fail/issue-13482-2.rs b/src/test/compile-fail/issue-13482-2.rs new file mode 100644 index 00000000000..6746b90e32d --- /dev/null +++ b/src/test/compile-fail/issue-13482-2.rs @@ -0,0 +1,21 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags:-Z verbose + +fn main() { + let x = [1,2]; + let y = match x { + [] => None, + //~^ ERROR types: expected `[_#0i, ..2]`, found `[_#7, ..0]` + // (expected array of 2 elements, found array of 0 elements) + [a,_] => Some(a) + }; +} diff --git a/src/test/compile-fail/issue-13482.rs b/src/test/compile-fail/issue-13482.rs index 43c7f45e15a..18070ed53b0 100644 --- a/src/test/compile-fail/issue-13482.rs +++ b/src/test/compile-fail/issue-13482.rs @@ -12,8 +12,8 @@ fn main() { let x = [1,2]; let y = match x { [] => None, -//~^ ERROR mismatched types: expected `[<generic integer #0>, ..2]`, found `[<generic #7>, ..0]` -// (expected array, found array) +//~^ ERROR types: expected `[_, ..2]`, found `[_, ..0]` +// (expected array of 2 elements, found array of 0 elements) [a,_] => Some(a) }; } diff --git a/src/test/compile-fail/issue-16338.rs b/src/test/compile-fail/issue-16338.rs index 537fc5aaa55..f62bccb22f3 100644 --- a/src/test/compile-fail/issue-16338.rs +++ b/src/test/compile-fail/issue-16338.rs @@ -12,7 +12,7 @@ use std::raw::Slice; fn main() { let Slice { data: data, len: len } = "foo"; - //~^ ERROR mismatched types: expected `&str`, found `core::raw::Slice<<generic #3>>` + //~^ ERROR mismatched types: expected `&str`, found `core::raw::Slice<_>` // (expected &-ptr, found struct core::raw::Slice) } diff --git a/src/test/compile-fail/issue-16401.rs b/src/test/compile-fail/issue-16401.rs index deb2f5912b6..4890cc52c00 100644 --- a/src/test/compile-fail/issue-16401.rs +++ b/src/test/compile-fail/issue-16401.rs @@ -13,7 +13,7 @@ use std::raw::Slice; fn main() { match () { Slice { data: data, len: len } => (), - //~^ ERROR mismatched types: expected `()`, found `core::raw::Slice<<generic #3>>` + //~^ ERROR mismatched types: expected `()`, found `core::raw::Slice<_>` // (expected (), found struct core::raw::Slice) _ => unreachable!() } diff --git a/src/test/compile-fail/issue-3680.rs b/src/test/compile-fail/issue-3680.rs index 96a93c205fe..f018a02a945 100644 --- a/src/test/compile-fail/issue-3680.rs +++ b/src/test/compile-fail/issue-3680.rs @@ -11,7 +11,7 @@ fn main() { match None { Err(_) => () - //~^ ERROR mismatched types: expected `core::option::Option<<generic #1>>` - // , found `core::result::Result<<generic #2>,<generic #3>>` + //~^ ERROR mismatched types: expected `core::option::Option<_>` + // , found `core::result::Result<_, _>` } } diff --git a/src/test/compile-fail/issue-4201.rs b/src/test/compile-fail/issue-4201.rs index 4b2be9e58ac..0391c73d90a 100644 --- a/src/test/compile-fail/issue-4201.rs +++ b/src/test/compile-fail/issue-4201.rs @@ -12,7 +12,7 @@ fn main() { let a = if true { 0 } else if false { -//~^ ERROR if may be missing an else clause: expected `()`, found `<generic integer #1>` +//~^ ERROR if may be missing an else clause: expected `()`, found `_` 1 }; } diff --git a/src/test/compile-fail/issue-4968.rs b/src/test/compile-fail/issue-4968.rs index a181215f418..cf1f1f59089 100644 --- a/src/test/compile-fail/issue-4968.rs +++ b/src/test/compile-fail/issue-4968.rs @@ -13,6 +13,6 @@ const A: (int,int) = (4,2); fn main() { match 42 { A => () } - //~^ ERROR mismatched types: expected `<generic integer #0>`, found `(int,int)` + //~^ ERROR mismatched types: expected `_`, found `(int, int)` // (expected integral variable, found tuple) } diff --git a/src/test/compile-fail/issue-5100.rs b/src/test/compile-fail/issue-5100.rs index 3ddb713528c..ddd82af01a7 100644 --- a/src/test/compile-fail/issue-5100.rs +++ b/src/test/compile-fail/issue-5100.rs @@ -13,32 +13,32 @@ enum A { B, C } fn main() { match (true, false) { B => (), - //~^ ERROR mismatched types: expected `(bool,bool)`, found `A` - // (expected tuple, found enum A) +//~^ ERROR mismatched types: expected `(bool, bool)`, found `A` (expected tuple, found enum A) _ => () } match (true, false) { (true, false, false) => () - //~^ ERROR mismatched types: expected `(bool,bool)`, - // found `(<generic #7>,<generic #8>,<generic #9>)` - // (expected a tuple with 2 elements, found one with 3 elements) +//~^ ERROR mismatched types: expected `(bool, bool)`, found `(_, _, _)` + } + + match (true, false) { + (true, false, false) => () +//~^ ERROR (expected a tuple with 2 elements, found one with 3 elements) } match (true, false) { box (true, false) => () - //~^ ERROR mismatched types: expected `(bool,bool)`, found `Box<<generic #15>>` - // (expected tuple, found box) +//~^ ERROR mismatched types: expected `(bool, bool)`, found `Box<_>` (expected tuple, found box) } match (true, false) { &(true, false) => () - //~^ ERROR mismatched types: expected `(bool,bool)`, found `&<generic #21>` - // (expected tuple, found &-ptr) +//~^ ERROR mismatched types: expected `(bool, bool)`, found `&_` (expected tuple, found &-ptr) } - let v = [('a', 'b') //~ ERROR expected function, found `(char,char)` + let v = [('a', 'b') //~ ERROR expected function, found `(char, char)` ('c', 'd'), ('e', 'f')]; diff --git a/src/test/compile-fail/issue-5500.rs b/src/test/compile-fail/issue-5500.rs index 86ff29a52b0..56867349065 100644 --- a/src/test/compile-fail/issue-5500.rs +++ b/src/test/compile-fail/issue-5500.rs @@ -10,5 +10,5 @@ fn main() { &panic!() - //~^ ERROR mismatched types: expected `()`, found `&<generic #2>` (expected (), found &-ptr) + //~^ ERROR mismatched types: expected `()`, found `&_` (expected (), found &-ptr) } diff --git a/src/test/compile-fail/issue-7092.rs b/src/test/compile-fail/issue-7092.rs index cc7e8052920..116639f4945 100644 --- a/src/test/compile-fail/issue-7092.rs +++ b/src/test/compile-fail/issue-7092.rs @@ -14,7 +14,7 @@ enum Whatever { fn foo(x: Whatever) { match x { Some(field) => -//~^ ERROR: mismatched types: expected `Whatever`, found `core::option::Option<<generic #3>>` +//~^ ERROR: mismatched types: expected `Whatever`, found `core::option::Option<_>` field.access(), //~ ERROR the type of this value must be known in this context } } diff --git a/src/test/compile-fail/issue-7867.rs b/src/test/compile-fail/issue-7867.rs index 0ab551642a0..f3915634cc1 100644 --- a/src/test/compile-fail/issue-7867.rs +++ b/src/test/compile-fail/issue-7867.rs @@ -14,14 +14,14 @@ mod foo { pub fn bar() {} } fn main() { match (true, false) { - B => (), //~ ERROR expected `(bool,bool)`, found `A` (expected tuple, found enum A) + B => (), //~ ERROR expected `(bool, bool)`, found `A` (expected tuple, found enum A) _ => () } match &Some(42i) { Some(x) => (), //~ ERROR expected `&core::option::Option<int>`, - // found `core::option::Option<<generic #4>>` + // found `core::option::Option<_>` None => () //~ ERROR expected `&core::option::Option<int>`, - // found `core::option::Option<<generic #5>>` + // found `core::option::Option<_>` } } diff --git a/src/test/compile-fail/map-types.rs b/src/test/compile-fail/map-types.rs index cbe39132479..6f032c5b1f0 100644 --- a/src/test/compile-fail/map-types.rs +++ b/src/test/compile-fail/map-types.rs @@ -18,5 +18,5 @@ fn main() { let x: Box<HashMap<int, int>> = box HashMap::new(); let x: Box<Map<int, int>> = x; let y: Box<Map<uint, int>> = box x; - //~^ ERROR the trait `collections::Map<uint,int>` is not implemented + //~^ ERROR the trait `collections::Map<uint, int>` is not implemented } diff --git a/src/test/compile-fail/match-vec-mismatch-2.rs b/src/test/compile-fail/match-vec-mismatch-2.rs index 6d37eb8a636..6bb049f3ca5 100644 --- a/src/test/compile-fail/match-vec-mismatch-2.rs +++ b/src/test/compile-fail/match-vec-mismatch-2.rs @@ -11,6 +11,6 @@ fn main() { match () { [()] => { } -//~^ ERROR mismatched types: expected `()`, found `&[<generic #1>]` (expected (), found &-ptr) +//~^ ERROR mismatched types: expected `()`, found `&[_]` (expected (), found &-ptr) } } diff --git a/src/test/compile-fail/repeat_count.rs b/src/test/compile-fail/repeat_count.rs index 8a28819a736..be79a7a915b 100644 --- a/src/test/compile-fail/repeat_count.rs +++ b/src/test/compile-fail/repeat_count.rs @@ -18,7 +18,7 @@ fn main() { let c = [0, ..true]; //~ ERROR expected positive integer for repeat count, found boolean //~^ ERROR: expected `uint`, found `bool` let d = [0, ..0.5]; //~ ERROR expected positive integer for repeat count, found float - //~^ ERROR: expected `uint`, found `<generic float #0>` + //~^ ERROR: expected `uint`, found `_` let e = [0, .."foo"]; //~ ERROR expected positive integer for repeat count, found string //~^ ERROR: expected `uint`, found `&'static str` let f = [0, ..-4]; diff --git a/src/test/compile-fail/slightly-nice-generic-literal-messages.rs b/src/test/compile-fail/slightly-nice-generic-literal-messages.rs index aebe78b18e0..a655a17c037 100644 --- a/src/test/compile-fail/slightly-nice-generic-literal-messages.rs +++ b/src/test/compile-fail/slightly-nice-generic-literal-messages.rs @@ -13,7 +13,7 @@ struct Foo<T,U>(T); fn main() { match Foo(1.1) { 1 => {} - //~^ ERROR expected `Foo<<generic float #0>,<generic #2>>`, found `<generic integer #0>` + //~^ ERROR expected `Foo<_, _>`, found `_` } } diff --git a/src/test/compile-fail/suppressed-error.rs b/src/test/compile-fail/suppressed-error.rs index 54d6fa5bdd3..27f50be528c 100644 --- a/src/test/compile-fail/suppressed-error.rs +++ b/src/test/compile-fail/suppressed-error.rs @@ -10,6 +10,6 @@ fn main() { let (x, y) = (); -//~^ ERROR types: expected `()`, found `(<generic #3>,<generic #4>)` (expected (), found tuple) +//~^ ERROR expected `()`, found `(_, _)` (expected (), found tuple) return x; } diff --git a/src/test/compile-fail/tuple-arity-mismatch.rs b/src/test/compile-fail/tuple-arity-mismatch.rs index 1500a3cbe52..d0c2faed4b2 100644 --- a/src/test/compile-fail/tuple-arity-mismatch.rs +++ b/src/test/compile-fail/tuple-arity-mismatch.rs @@ -15,4 +15,7 @@ fn first((value, _): (int, f64)) -> int { value } fn main() { let y = first ((1,2.0,3)); //~^ ERROR expected a tuple with 2 elements, found one with 3 elements + + let y = first ((1,)); + //~^ ERROR expected `(int, f64)`, found `(int,)` } diff --git a/src/test/compile-fail/tuple-index-out-of-bounds.rs b/src/test/compile-fail/tuple-index-out-of-bounds.rs index d16f950a5d4..f9bf2746794 100644 --- a/src/test/compile-fail/tuple-index-out-of-bounds.rs +++ b/src/test/compile-fail/tuple-index-out-of-bounds.rs @@ -22,5 +22,5 @@ fn main() { tuple.0; tuple.1; tuple.2; - //~^ ERROR attempted out-of-bounds tuple index `2` on type `(int,int)` + //~^ ERROR attempted out-of-bounds tuple index `2` on type `(int, int)` } diff --git a/src/test/compile-fail/type-parameter-names.rs b/src/test/compile-fail/type-parameter-names.rs index e1a29afa737..42691fa5229 100644 --- a/src/test/compile-fail/type-parameter-names.rs +++ b/src/test/compile-fail/type-parameter-names.rs @@ -11,6 +11,9 @@ // Test that we print out the names of type parameters correctly in // our error messages. -fn foo<Foo, Bar>(x: Foo) -> Bar { x } //~ ERROR expected `Bar`, found `Foo` +fn foo<Foo, Bar>(x: Foo) -> Bar { + x +//~^ ERROR expected `Bar`, found `Foo` (expected type parameter, found a different type parameter) +} fn main() {} diff --git a/src/test/compile-fail/typeck_type_placeholder_mismatch.rs b/src/test/compile-fail/typeck_type_placeholder_mismatch.rs index 29d32b10539..aa7b551afc5 100644 --- a/src/test/compile-fail/typeck_type_placeholder_mismatch.rs +++ b/src/test/compile-fail/typeck_type_placeholder_mismatch.rs @@ -19,11 +19,11 @@ pub fn main() { fn test1() { let x: Foo<_> = Bar::<uint>; - //~^ ERROR mismatched types: expected `Foo<<generic #0>>`, found `Bar<uint>` + //~^ ERROR mismatched types: expected `Foo<_>`, found `Bar<uint>` let y: Foo<uint> = x; } fn test2() { let x: Foo<_> = Bar::<uint>; - //~^ ERROR mismatched types: expected `Foo<<generic #0>>`, found `Bar<uint>` + //~^ ERROR mismatched types: expected `Foo<_>`, found `Bar<uint>` } |
