Add version mismatch help message for unimplemented trait
Issue #22750 The error reporting for E0277 (the trait `X` is not implemented for `Foo`) now checks whether `Foo` implements a trait with the same path as `X`, which probably means that the programmer wanted to actually use only one version of the trait `X` instead of the two.
This commit is contained in:
parent
b56b23988d
commit
dffdf378ee
5 changed files with 87 additions and 7 deletions
|
|
@ -2,10 +2,4 @@ pub struct Foo;
|
|||
|
||||
pub trait Bar{}
|
||||
|
||||
pub fn bar() -> Box<Bar> {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
|
||||
pub fn try_foo(x: Foo){}
|
||||
pub fn try_bar(x: Box<Bar>){}
|
||||
pub fn try_foo(x: impl Bar){}
|
||||
|
|
|
|||
5
src/test/ui/traits/auxiliary/crate_a2.rs
Normal file
5
src/test/ui/traits/auxiliary/crate_a2.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
pub struct Foo;
|
||||
|
||||
pub trait Bar{}
|
||||
|
||||
impl Bar for Foo {}
|
||||
21
src/test/ui/traits/trait-bounds-same-crate-name.rs
Normal file
21
src/test/ui/traits/trait-bounds-same-crate-name.rs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
// aux-build:crate_a1.rs
|
||||
// aux-build:crate_a2.rs
|
||||
|
||||
// Issue 22750
|
||||
// This tests the extra help message reported when a trait bound
|
||||
// is not met but the struct implements a trait with the same path.
|
||||
|
||||
fn main() {
|
||||
let foo2 = {
|
||||
extern crate crate_a2 as a;
|
||||
a::Foo
|
||||
};
|
||||
|
||||
{
|
||||
extern crate crate_a1 as a;
|
||||
a::try_foo(foo2);
|
||||
//~^ ERROR E0277
|
||||
//~| Trait impl with same name found
|
||||
//~| Perhaps two different versions of crate `crate_a2`
|
||||
}
|
||||
}
|
||||
21
src/test/ui/traits/trait-bounds-same-crate-name.stderr
Normal file
21
src/test/ui/traits/trait-bounds-same-crate-name.stderr
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
error[E0277]: the trait bound `main::a::Foo: main::a::Bar` is not satisfied
|
||||
--> $DIR/trait-bounds-same-crate-name.rs:16:20
|
||||
|
|
||||
LL | a::try_foo(foo2);
|
||||
| ^^^^ the trait `main::a::Bar` is not implemented for `main::a::Foo`
|
||||
|
|
||||
::: $DIR/auxiliary/crate_a1.rs:5:24
|
||||
|
|
||||
LL | pub fn try_foo(x: impl Bar){}
|
||||
| --- required by this bound in `main::a::try_foo`
|
||||
|
|
||||
help: Trait impl with same name found
|
||||
--> $DIR/auxiliary/crate_a2.rs:5:1
|
||||
|
|
||||
LL | impl Bar for Foo {}
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
= note: Perhaps two different versions of crate `crate_a2` are being used?
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue