-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Add version mismatch help message for unimplemented trait #66561
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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> {} |
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> {} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
// aux-build:crate_a1.rs | ||
// aux-build:crate_a2.rs | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There's one new test for the case where the diagnostic is correct. Do we also want testcases that verify that the diagnostic is not emitted? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Negative tests are always good to have, particularly because incorrect suggestions are sometimes worse than no suggestions. Can you create one for the case you mention? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm adding a few cases:
|
||
|
||
// 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: | ||
} | ||
} |
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`. |
Uh oh!
There was an error while loading. Please reload this page.