diff options
| author | bors <bors@rust-lang.org> | 2017-05-23 00:36:56 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-05-23 00:36:56 +0000 |
| commit | 2e9139197e908435673c62a14381fbd4f8166319 (patch) | |
| tree | 19b77875f70eb6c04366ac3b21ae22636f21f1d4 /src/test/compile-fail | |
| parent | 81734e0e06d24cf580dd5352c64d10110e4d3b7b (diff) | |
| parent | 747287a2b3b6649d59cfd11be1fb32e667f71a3f (diff) | |
| download | rust-2e9139197e908435673c62a14381fbd4f8166319.tar.gz rust-2e9139197e908435673c62a14381fbd4f8166319.zip | |
Auto merge of #41559 - GuillaumeGomez:partial-eq-msg, r=estebank
Add better error message when == operator is badly used
Part of #40660.
With the following code:
```rust
fn foo<T: PartialEq>(a: &T, b: T) {
a == b;
}
fn main() {
foo(&1, 1);
}
```
It prints:
```
error[E0277]: the trait bound `&T: std::cmp::PartialEq<T>` is not satisfied
--> test.rs:2:5
|
2 | a == b;
| ^^^^^^ can't compare `&T` with `T`
|
= help: the trait `std::cmp::PartialEq<T>` is not implemented for `&T`
= help: consider adding a `where &T: std::cmp::PartialEq<T>` bound
error: aborting due to previous error
```
Diffstat (limited to 'src/test/compile-fail')
| -rw-r--r-- | src/test/compile-fail/E0277-2.rs | 1 | ||||
| -rw-r--r-- | src/test/compile-fail/E0277.rs | 1 | ||||
| -rw-r--r-- | src/test/compile-fail/const-unsized.rs | 4 | ||||
| -rw-r--r-- | src/test/compile-fail/impl-trait/auto-trait-leak.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/on-unimplemented/multiple-impls.rs | 3 | ||||
| -rw-r--r-- | src/test/compile-fail/on-unimplemented/on-impl.rs | 1 | ||||
| -rw-r--r-- | src/test/compile-fail/on-unimplemented/on-trait.rs | 3 | ||||
| -rw-r--r-- | src/test/compile-fail/on-unimplemented/slice-index.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/partialeq_help.rs | 20 | ||||
| -rw-r--r-- | src/test/compile-fail/trait-suggest-where-clause.rs | 16 |
10 files changed, 30 insertions, 23 deletions
diff --git a/src/test/compile-fail/E0277-2.rs b/src/test/compile-fail/E0277-2.rs index 211c0e6f890..816d3529554 100644 --- a/src/test/compile-fail/E0277-2.rs +++ b/src/test/compile-fail/E0277-2.rs @@ -25,7 +25,6 @@ fn is_send<T: Send>() { } fn main() { is_send::<Foo>(); //~^ ERROR the trait bound `*const u8: std::marker::Send` is not satisfied in `Foo` - //~| NOTE within `Foo`, the trait `std::marker::Send` is not implemented for `*const u8` //~| NOTE: `*const u8` cannot be sent between threads safely //~| NOTE: required because it appears within the type `Baz` //~| NOTE: required because it appears within the type `Bar` diff --git a/src/test/compile-fail/E0277.rs b/src/test/compile-fail/E0277.rs index e31fea1e458..8b34936419d 100644 --- a/src/test/compile-fail/E0277.rs +++ b/src/test/compile-fail/E0277.rs @@ -20,7 +20,6 @@ fn some_func<T: Foo>(foo: T) { fn f(p: Path) { } //~^ ERROR the trait bound `[u8]: std::marker::Sized` is not satisfied in `std::path::Path` -//~| NOTE within `std::path::Path`, the trait `std::marker::Sized` is not implemented for `[u8]` //~| NOTE `[u8]` does not have a constant size known at compile-time //~| NOTE required because it appears within the type `std::path::Path` //~| NOTE all local variables must have a statically known size diff --git a/src/test/compile-fail/const-unsized.rs b/src/test/compile-fail/const-unsized.rs index 23cff4ac6ad..4b212814ded 100644 --- a/src/test/compile-fail/const-unsized.rs +++ b/src/test/compile-fail/const-unsized.rs @@ -12,25 +12,21 @@ use std::fmt::Debug; const CONST_0: Debug+Sync = *(&0 as &(Debug+Sync)); //~^ ERROR `std::fmt::Debug + std::marker::Sync + 'static: std::marker::Sized` is not satisfied -//~| NOTE the trait `std::marker::Sized` is not implemented for `std::fmt::Debug + std::marker::Syn //~| NOTE does not have a constant size known at compile-time //~| NOTE constant expressions must have a statically known size const CONST_FOO: str = *"foo"; //~^ ERROR `str: std::marker::Sized` is not satisfied -//~| NOTE the trait `std::marker::Sized` is not implemented for `str` //~| NOTE does not have a constant size known at compile-time //~| NOTE constant expressions must have a statically known size static STATIC_1: Debug+Sync = *(&1 as &(Debug+Sync)); //~^ ERROR `std::fmt::Debug + std::marker::Sync + 'static: std::marker::Sized` is not satisfied -//~| NOTE the trait `std::marker::Sized` is not implemented for `std::fmt::Debug + std::marker::Syn //~| NOTE does not have a constant size known at compile-time //~| NOTE constant expressions must have a statically known size static STATIC_BAR: str = *"bar"; //~^ ERROR `str: std::marker::Sized` is not satisfied -//~| NOTE the trait `std::marker::Sized` is not implemented for `str` //~| NOTE does not have a constant size known at compile-time //~| NOTE constant expressions must have a statically known size diff --git a/src/test/compile-fail/impl-trait/auto-trait-leak.rs b/src/test/compile-fail/impl-trait/auto-trait-leak.rs index 13e53cab172..8a5033e7647 100644 --- a/src/test/compile-fail/impl-trait/auto-trait-leak.rs +++ b/src/test/compile-fail/impl-trait/auto-trait-leak.rs @@ -26,7 +26,6 @@ fn send<T: Send>(_: T) {} fn main() { send(before()); //~^ ERROR the trait bound `std::rc::Rc<std::cell::Cell<i32>>: std::marker::Send` is not satisfied - //~| NOTE the trait `std::marker::Send` is not implemented for `std::rc::Rc<std::cell::Cell<i32>>` //~| NOTE `std::rc::Rc<std::cell::Cell<i32>>` cannot be sent between threads safely //~| NOTE required because it appears within the type `[closure //~| NOTE required because it appears within the type `impl std::ops::Fn<(i32,)>` @@ -34,7 +33,6 @@ fn main() { send(after()); //~^ ERROR the trait bound `std::rc::Rc<std::cell::Cell<i32>>: std::marker::Send` is not satisfied - //~| NOTE the trait `std::marker::Send` is not implemented for `std::rc::Rc<std::cell::Cell<i32>>` //~| NOTE `std::rc::Rc<std::cell::Cell<i32>>` cannot be sent between threads safely //~| NOTE required because it appears within the type `[closure //~| NOTE required because it appears within the type `impl std::ops::Fn<(i32,)>` diff --git a/src/test/compile-fail/on-unimplemented/multiple-impls.rs b/src/test/compile-fail/on-unimplemented/multiple-impls.rs index 0ad9f21e098..0df8c41ffe1 100644 --- a/src/test/compile-fail/on-unimplemented/multiple-impls.rs +++ b/src/test/compile-fail/on-unimplemented/multiple-impls.rs @@ -42,17 +42,14 @@ impl Index<Bar<usize>> for [i32] { fn main() { Index::index(&[] as &[i32], 2u32); //~^ ERROR E0277 - //~| NOTE the trait `Index<u32>` is not implemented for `[i32]` //~| NOTE trait message //~| NOTE required by Index::index(&[] as &[i32], Foo(2u32)); //~^ ERROR E0277 - //~| NOTE the trait `Index<Foo<u32>>` is not implemented for `[i32]` //~| NOTE on impl for Foo //~| NOTE required by Index::index(&[] as &[i32], Bar(2u32)); //~^ ERROR E0277 - //~| NOTE the trait `Index<Bar<u32>>` is not implemented for `[i32]` //~| NOTE on impl for Bar //~| NOTE required by } diff --git a/src/test/compile-fail/on-unimplemented/on-impl.rs b/src/test/compile-fail/on-unimplemented/on-impl.rs index a7c599330a0..79021cd03cc 100644 --- a/src/test/compile-fail/on-unimplemented/on-impl.rs +++ b/src/test/compile-fail/on-unimplemented/on-impl.rs @@ -31,7 +31,6 @@ impl Index<usize> for [i32] { fn main() { Index::<u32>::index(&[1, 2, 3] as &[i32], 2u32); //~^ ERROR E0277 - //~| NOTE the trait `Index<u32>` is not implemented for `[i32]` //~| NOTE a usize is required //~| NOTE required by } diff --git a/src/test/compile-fail/on-unimplemented/on-trait.rs b/src/test/compile-fail/on-unimplemented/on-trait.rs index 0f4b0919b65..a8daef356a5 100644 --- a/src/test/compile-fail/on-unimplemented/on-trait.rs +++ b/src/test/compile-fail/on-unimplemented/on-trait.rs @@ -35,9 +35,8 @@ pub fn main() { //~^ ERROR //~^^ NOTE a collection of type `std::option::Option<std::vec::Vec<u8>>` cannot be built from an iterator over elements of type `&u8` //~^^^ NOTE required by `collect` - //~| NOTE the trait `MyFromIterator<&u8>` is not implemented for `std::option::Option<std::vec::Vec<u8>>` + let x: String = foobar(); //~ ERROR //~^ NOTE test error `std::string::String` with `u8` `_` `u32` //~^^ NOTE required by `foobar` - //~| NOTE the trait `Foo<u8, _, u32>` is not implemented for `std::string::String` } diff --git a/src/test/compile-fail/on-unimplemented/slice-index.rs b/src/test/compile-fail/on-unimplemented/slice-index.rs index 1a9ed2dd6e4..5d30c2e982e 100644 --- a/src/test/compile-fail/on-unimplemented/slice-index.rs +++ b/src/test/compile-fail/on-unimplemented/slice-index.rs @@ -20,10 +20,8 @@ fn main() { let x = &[1, 2, 3] as &[i32]; x[1i32]; //~ ERROR E0277 //~| NOTE slice indices are of type `usize` or ranges of `usize` - //~| NOTE trait `std::slice::SliceIndex<[i32]>` is not implemented for `i32` //~| NOTE required because of the requirements on the impl of `std::ops::Index<i32>` x[..1i32]; //~ ERROR E0277 //~| NOTE slice indices are of type `usize` or ranges of `usize` - //~| NOTE trait `std::slice::SliceIndex<[i32]>` is not implemented for `std::ops::RangeTo<i32>` //~| NOTE requirements on the impl of `std::ops::Index<std::ops::RangeTo<i32>>` } diff --git a/src/test/compile-fail/partialeq_help.rs b/src/test/compile-fail/partialeq_help.rs new file mode 100644 index 00000000000..52c24473bd3 --- /dev/null +++ b/src/test/compile-fail/partialeq_help.rs @@ -0,0 +1,20 @@ +// 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 foo<T: PartialEq>(a: &T, b: T) { + a == b; //~ ERROR E0277 + //~| NOTE can't compare `&T` with `T` + //~| HELP the trait `std::cmp::PartialEq<T>` is not implemented for `&T` + //~| HELP consider adding a `where &T: std::cmp::PartialEq<T>` bound +} + +fn main() { + foo(&1, 1); +} diff --git a/src/test/compile-fail/trait-suggest-where-clause.rs b/src/test/compile-fail/trait-suggest-where-clause.rs index 7530d8890b9..2c38d8d2e28 100644 --- a/src/test/compile-fail/trait-suggest-where-clause.rs +++ b/src/test/compile-fail/trait-suggest-where-clause.rs @@ -16,51 +16,53 @@ fn check<T: Iterator, U: ?Sized>() { // suggest a where-clause, if needed mem::size_of::<U>(); //~^ ERROR `U: std::marker::Sized` is not satisfied - //~| NOTE the trait `std::marker::Sized` is not implemented for `U` //~| HELP consider adding a `where U: std::marker::Sized` bound //~| NOTE required by `std::mem::size_of` + //~| NOTE `U` does not have a constant size known at compile-time + //~| HELP the trait `std::marker::Sized` is not implemented for `U` mem::size_of::<Misc<U>>(); //~^ ERROR `U: std::marker::Sized` is not satisfied - //~| NOTE the trait `std::marker::Sized` is not implemented for `U` //~| HELP consider adding a `where U: std::marker::Sized` bound //~| NOTE required because it appears within the type `Misc<U>` //~| NOTE required by `std::mem::size_of` + //~| NOTE `U` does not have a constant size known at compile-time + //~| HELP within `Misc<U>`, the trait `std::marker::Sized` is not implemented for `U` // ... even if T occurs as a type parameter <u64 as From<T>>::from; //~^ ERROR `u64: std::convert::From<T>` is not satisfied - //~| NOTE the trait `std::convert::From<T>` is not implemented for `u64` //~| HELP consider adding a `where u64: std::convert::From<T>` bound //~| NOTE required by `std::convert::From::from` + //~| NOTE the trait `std::convert::From<T>` is not implemented for `u64` <u64 as From<<T as Iterator>::Item>>::from; //~^ ERROR `u64: std::convert::From<<T as std::iter::Iterator>::Item>` is not satisfied - //~| NOTE the trait `std::convert::From<<T as std::iter::Iterator>::Item>` is not implemented //~| HELP consider adding a `where u64: //~| NOTE required by `std::convert::From::from` + //~| NOTE the trait `std::convert::From<<T as std::iter::Iterator>::Item>` is not implemented // ... but not if there are inference variables <Misc<_> as From<T>>::from; //~^ ERROR `Misc<_>: std::convert::From<T>` is not satisfied - //~| NOTE the trait `std::convert::From<T>` is not implemented for `Misc<_>` //~| NOTE required by `std::convert::From::from` + //~| NOTE the trait `std::convert::From<T>` is not implemented for `Misc<_>` // ... and also not if the error is not related to the type mem::size_of::<[T]>(); //~^ ERROR `[T]: std::marker::Sized` is not satisfied - //~| NOTE the trait `std::marker::Sized` is not implemented for `[T]` //~| NOTE `[T]` does not have a constant size //~| NOTE required by `std::mem::size_of` + //~| HELP the trait `std::marker::Sized` is not implemented for `[T]` mem::size_of::<[&U]>(); //~^ ERROR `[&U]: std::marker::Sized` is not satisfied - //~| NOTE the trait `std::marker::Sized` is not implemented for `[&U]` //~| NOTE `[&U]` does not have a constant size //~| NOTE required by `std::mem::size_of` + //~| HELP the trait `std::marker::Sized` is not implemented for `[&U]` } fn main() { |
