-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #66561 - TimoFreiberg:trait-name-report, r=estebank
Add version mismatch help message for unimplemented trait Improves 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. Still open: * the same diagnostic should be added for [the trait method case](#22750 (comment)) * Showing the real crate versions would be nice, but rustc currently doesn't have that information [according to Esteban](https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/diagnostics.20for.20crate.20version.20mismatch/near/180572989)
- Loading branch information
Showing
5 changed files
with
176 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,9 @@ | ||
pub struct Foo; | ||
pub trait Bar {} | ||
|
||
pub trait Bar{} | ||
pub fn try_foo(x: impl Bar) {} | ||
|
||
pub fn bar() -> Box<Bar> { | ||
unimplemented!() | ||
pub struct ImplementsTraitForUsize<T> { | ||
_marker: std::marker::PhantomData<T>, | ||
} | ||
|
||
|
||
pub fn try_foo(x: Foo){} | ||
pub fn try_bar(x: Box<Bar>){} | ||
impl Bar for ImplementsTraitForUsize<usize> {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
pub struct Foo; | ||
|
||
pub trait Bar {} | ||
|
||
impl Bar for Foo {} | ||
|
||
pub struct DoesNotImplementTrait; | ||
|
||
pub struct ImplementsWrongTraitConditionally<T> { | ||
_marker: std::marker::PhantomData<T>, | ||
} | ||
|
||
impl Bar for ImplementsWrongTraitConditionally<isize> {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
// 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 foo = { | ||
extern crate crate_a2 as a; | ||
a::Foo | ||
}; | ||
|
||
let implements_no_traits = { | ||
extern crate crate_a2 as a; | ||
a::DoesNotImplementTrait | ||
}; | ||
|
||
let other_variant_implements_mismatched_trait = { | ||
extern crate crate_a2 as a; | ||
a::ImplementsWrongTraitConditionally { _marker: std::marker::PhantomData::<isize> } | ||
}; | ||
|
||
let other_variant_implements_correct_trait = { | ||
extern crate crate_a1 as a; | ||
a::ImplementsTraitForUsize { _marker: std::marker::PhantomData::<isize> } | ||
}; | ||
|
||
{ | ||
extern crate crate_a1 as a; | ||
a::try_foo(foo); | ||
//~^ ERROR E0277 | ||
//~| trait impl with same name found | ||
//~| Perhaps two different versions of crate `crate_a2` | ||
|
||
// We don't want to see the "version mismatch" help message here | ||
// because `implements_no_traits` has no impl for `Foo` | ||
a::try_foo(implements_no_traits); | ||
//~^ ERROR E0277 | ||
|
||
// We don't want to see the "version mismatch" help message here | ||
// because `other_variant_implements_mismatched_trait` | ||
// does not have an impl for its `<isize>` variant, | ||
// only for its `<usize>` variant. | ||
a::try_foo(other_variant_implements_mismatched_trait); | ||
//~^ ERROR E0277 | ||
|
||
// We don't want to see the "version mismatch" help message here | ||
// because `ImplementsTraitForUsize` only has | ||
// impls for the correct trait where the path is not misleading. | ||
a::try_foo(other_variant_implements_correct_trait); | ||
//~^ ERROR E0277 | ||
//~| the following implementations were found: | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
error[E0277]: the trait bound `main::a::Foo: main::a::Bar` is not satisfied | ||
--> $DIR/trait-bounds-same-crate-name.rs:31:20 | ||
| | ||
LL | a::try_foo(foo); | ||
| ^^^ the trait `main::a::Bar` is not implemented for `main::a::Foo` | ||
| | ||
::: $DIR/auxiliary/crate_a1.rs:3: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[E0277]: the trait bound `main::a::DoesNotImplementTrait: main::a::Bar` is not satisfied | ||
--> $DIR/trait-bounds-same-crate-name.rs:38:20 | ||
| | ||
LL | a::try_foo(implements_no_traits); | ||
| ^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `main::a::DoesNotImplementTrait` | ||
| | ||
::: $DIR/auxiliary/crate_a1.rs:3:24 | ||
| | ||
LL | pub fn try_foo(x: impl Bar) {} | ||
| --- required by this bound in `main::a::try_foo` | ||
|
||
error[E0277]: the trait bound `main::a::ImplementsWrongTraitConditionally<isize>: main::a::Bar` is not satisfied | ||
--> $DIR/trait-bounds-same-crate-name.rs:45:20 | ||
| | ||
LL | a::try_foo(other_variant_implements_mismatched_trait); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `main::a::ImplementsWrongTraitConditionally<isize>` | ||
| | ||
::: $DIR/auxiliary/crate_a1.rs:3: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:13:1 | ||
| | ||
LL | impl Bar for ImplementsWrongTraitConditionally<isize> {} | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: Perhaps two different versions of crate `crate_a2` are being used? | ||
|
||
error[E0277]: the trait bound `main::a::ImplementsTraitForUsize<isize>: main::a::Bar` is not satisfied | ||
--> $DIR/trait-bounds-same-crate-name.rs:51:20 | ||
| | ||
LL | a::try_foo(other_variant_implements_correct_trait); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `main::a::ImplementsTraitForUsize<isize>` | ||
| | ||
::: $DIR/auxiliary/crate_a1.rs:3:24 | ||
| | ||
LL | pub fn try_foo(x: impl Bar) {} | ||
| --- required by this bound in `main::a::try_foo` | ||
| | ||
= help: the following implementations were found: | ||
<main::a::ImplementsTraitForUsize<usize> as main::a::Bar> | ||
|
||
error: aborting due to 4 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0277`. |