diff options
| author | bors <bors@rust-lang.org> | 2017-04-10 21:56:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-04-10 21:56:13 +0000 |
| commit | 730e5ad04e23f30cc24e4b87dfd5da807325e243 (patch) | |
| tree | ffaa2707a389f266128ffda4b87264935ae750d6 /src/test | |
| parent | 3b5754e5ce73d24c6684b3ed0c68a557dfdd2f52 (diff) | |
| parent | be8787dfe564cf315a9343a84724130da322e805 (diff) | |
| download | rust-730e5ad04e23f30cc24e4b87dfd5da807325e243.tar.gz rust-730e5ad04e23f30cc24e4b87dfd5da807325e243.zip | |
Auto merge of #40565 - estebank:binops-help, r=arielb1
Explicit help message for binop type mismatch
When trying to do `1 + Some(2)`, or some other binary operation on two
types different types without an appropriate trait implementation, provide
an explicit help message:
```rust
help: `{integer} + std::option::Option<{integer}>` has no implementation
```
Re: #39579, #38564, #37626, #39942, #34698.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/impl-trait/equality.rs (renamed from src/test/compile-fail/impl-trait/equality.rs) | 2 | ||||
| -rw-r--r-- | src/test/ui/impl-trait/equality.stderr | 55 | ||||
| -rw-r--r-- | src/test/ui/mismatched_types/binops.rs | 18 | ||||
| -rw-r--r-- | src/test/ui/mismatched_types/binops.stderr | 58 | ||||
| -rw-r--r-- | src/test/ui/span/multiline-span-simple.stderr | 6 |
5 files changed, 133 insertions, 6 deletions
diff --git a/src/test/compile-fail/impl-trait/equality.rs b/src/test/ui/impl-trait/equality.rs index 36df4f0eb4d..96db53ad2e4 100644 --- a/src/test/compile-fail/impl-trait/equality.rs +++ b/src/test/ui/impl-trait/equality.rs @@ -32,7 +32,7 @@ fn sum_to(n: u32) -> impl Foo { 0 } else { n + sum_to(n - 1) - //~^ ERROR the trait bound `u32: std::ops::Add<impl Foo>` is not satisfied + //~^ ERROR no implementation for `u32 + impl Foo` } } diff --git a/src/test/ui/impl-trait/equality.stderr b/src/test/ui/impl-trait/equality.stderr new file mode 100644 index 00000000000..bd024d6766e --- /dev/null +++ b/src/test/ui/impl-trait/equality.stderr @@ -0,0 +1,55 @@ +error[E0308]: mismatched types + --> $DIR/equality.rs:25:5 + | +25 | 0_u32 + | ^^^^^ expected i32, found u32 + | + = note: expected type `i32` + found type `u32` + +error[E0277]: the trait bound `u32: std::ops::Add<impl Foo>` is not satisfied + --> $DIR/equality.rs:34:9 + | +34 | n + sum_to(n - 1) + | ^^^^^^^^^^^^^^^^^ the trait `std::ops::Add<impl Foo>` is not implemented for `u32` + | + = note: no implementation for `u32 + impl Foo` + +error[E0308]: mismatched types + --> $DIR/equality.rs:53:18 + | +53 | let _: u32 = hide(0_u32); + | ^^^^^^^^^^^ expected u32, found anonymized type + | + = note: expected type `u32` + found type `impl Foo` + +error[E0308]: mismatched types + --> $DIR/equality.rs:59:18 + | +59 | let _: i32 = Leak::leak(hide(0_i32)); + | ^^^^^^^^^^^^^^^^^^^^^^^ expected i32, found associated type + | + = note: expected type `i32` + found type `<impl Foo as Leak>::T` + +error[E0308]: mismatched types + --> $DIR/equality.rs:66:10 + | +66 | x = (x.1, + | ^^^ expected u32, found i32 + | + = note: expected type `impl Foo` (u32) + found type `impl Foo` (i32) + +error[E0308]: mismatched types + --> $DIR/equality.rs:69:10 + | +69 | x.0); + | ^^^ expected i32, found u32 + | + = note: expected type `impl Foo` (i32) + found type `impl Foo` (u32) + +error: aborting due to 6 previous errors + diff --git a/src/test/ui/mismatched_types/binops.rs b/src/test/ui/mismatched_types/binops.rs new file mode 100644 index 00000000000..98449e59664 --- /dev/null +++ b/src/test/ui/mismatched_types/binops.rs @@ -0,0 +1,18 @@ +// Copyright 2017 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() { + 1 + Some(1); + 2 as usize - Some(1); + 3 * (); + 4 / ""; + 5 < String::new(); + 6 == Ok(1); +} diff --git a/src/test/ui/mismatched_types/binops.stderr b/src/test/ui/mismatched_types/binops.stderr new file mode 100644 index 00000000000..a0f7ff65870 --- /dev/null +++ b/src/test/ui/mismatched_types/binops.stderr @@ -0,0 +1,58 @@ +error[E0277]: the trait bound `{integer}: std::ops::Add<std::option::Option<{integer}>>` is not satisfied + --> $DIR/binops.rs:12:5 + | +12 | 1 + Some(1); + | ^^^^^^^^^^^ the trait `std::ops::Add<std::option::Option<{integer}>>` is not implemented for `{integer}` + | + = note: no implementation for `{integer} + std::option::Option<{integer}>` + +error[E0277]: the trait bound `usize: std::ops::Sub<std::option::Option<{integer}>>` is not satisfied + --> $DIR/binops.rs:13:5 + | +13 | 2 as usize - Some(1); + | ^^^^^^^^^^^^^^^^^^^^ the trait `std::ops::Sub<std::option::Option<{integer}>>` is not implemented for `usize` + | + = note: no implementation for `usize - std::option::Option<{integer}>` + +error[E0277]: the trait bound `{integer}: std::ops::Mul<()>` is not satisfied + --> $DIR/binops.rs:14:5 + | +14 | 3 * (); + | ^^^^^^ the trait `std::ops::Mul<()>` is not implemented for `{integer}` + | + = note: no implementation for `{integer} * ()` + +error[E0277]: the trait bound `{integer}: std::ops::Div<&str>` is not satisfied + --> $DIR/binops.rs:15:5 + | +15 | 4 / ""; + | ^^^^^^ the trait `std::ops::Div<&str>` is not implemented for `{integer}` + | + = note: no implementation for `{integer} / &str` + +error[E0277]: the trait bound `{integer}: std::cmp::PartialEq<std::string::String>` is not satisfied + --> $DIR/binops.rs:16:5 + | +16 | 5 < String::new(); + | ^^^^^^^^^^^^^^^^^ the trait `std::cmp::PartialEq<std::string::String>` is not implemented for `{integer}` + | + = note: can't compare `{integer}` with `std::string::String` + +error[E0277]: the trait bound `{integer}: std::cmp::PartialOrd<std::string::String>` is not satisfied + --> $DIR/binops.rs:16:5 + | +16 | 5 < String::new(); + | ^^^^^^^^^^^^^^^^^ the trait `std::cmp::PartialOrd<std::string::String>` is not implemented for `{integer}` + | + = note: can't compare `{integer}` with `std::string::String` + +error[E0277]: the trait bound `{integer}: std::cmp::PartialEq<std::result::Result<{integer}, _>>` is not satisfied + --> $DIR/binops.rs:17:5 + | +17 | 6 == Ok(1); + | ^^^^^^^^^^ the trait `std::cmp::PartialEq<std::result::Result<{integer}, _>>` is not implemented for `{integer}` + | + = note: can't compare `{integer}` with `std::result::Result<{integer}, _>` + +error: aborting due to 7 previous errors + diff --git a/src/test/ui/span/multiline-span-simple.stderr b/src/test/ui/span/multiline-span-simple.stderr index 85c11c05b9f..161b6ca48b2 100644 --- a/src/test/ui/span/multiline-span-simple.stderr +++ b/src/test/ui/span/multiline-span-simple.stderr @@ -9,11 +9,7 @@ error[E0277]: the trait bound `u32: std::ops::Add<()>` is not satisfied 27 | | y), | |______________^ ...ending here: the trait `std::ops::Add<()>` is not implemented for `u32` | - = help: the following implementations were found: - <u32 as std::ops::Add> - <&'a u32 as std::ops::Add<u32>> - <u32 as std::ops::Add<&'a u32>> - <&'b u32 as std::ops::Add<&'a u32>> + = note: no implementation for `u32 + ()` error: aborting due to previous error |
