fixup! Add negative tests where the diagnostic message would be wrong
This commit is contained in:
parent
dffdf378ee
commit
318fb9a4da
4 changed files with 103 additions and 14 deletions
|
|
@ -1,5 +1,9 @@
|
|||
pub struct Foo;
|
||||
pub trait Bar {}
|
||||
|
||||
pub trait Bar{}
|
||||
pub fn try_foo(x: impl Bar) {}
|
||||
|
||||
pub fn try_foo(x: impl Bar){}
|
||||
pub struct ImplementsTraitForUsize<T> {
|
||||
_marker: std::marker::PhantomData<T>,
|
||||
}
|
||||
|
||||
impl Bar for ImplementsTraitForUsize<usize> {}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,13 @@
|
|||
pub struct Foo;
|
||||
|
||||
pub trait Bar{}
|
||||
pub trait Bar {}
|
||||
|
||||
impl Bar for Foo {}
|
||||
|
||||
pub struct DoesNotImplementTrait;
|
||||
|
||||
pub struct ImplementsWrongTraitConditionally<T> {
|
||||
_marker: std::marker::PhantomData<T>,
|
||||
}
|
||||
|
||||
impl Bar for ImplementsWrongTraitConditionally<isize> {}
|
||||
|
|
|
|||
|
|
@ -6,16 +6,50 @@
|
|||
// is not met but the struct implements a trait with the same path.
|
||||
|
||||
fn main() {
|
||||
let foo2 = {
|
||||
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(foo2);
|
||||
a::try_foo(foo);
|
||||
//~^ ERROR E0277
|
||||
//~| Trait impl with same name found
|
||||
//~| 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:
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,21 +1,64 @@
|
|||
error[E0277]: the trait bound `main::a::Foo: main::a::Bar` is not satisfied
|
||||
--> $DIR/trait-bounds-same-crate-name.rs:16:20
|
||||
--> $DIR/trait-bounds-same-crate-name.rs:31:20
|
||||
|
|
||||
LL | a::try_foo(foo2);
|
||||
| ^^^^ the trait `main::a::Bar` is not implemented for `main::a::Foo`
|
||||
LL | a::try_foo(foo);
|
||||
| ^^^ the trait `main::a::Bar` is not implemented for `main::a::Foo`
|
||||
|
|
||||
::: $DIR/auxiliary/crate_a1.rs:5:24
|
||||
::: $DIR/auxiliary/crate_a1.rs:3:24
|
||||
|
|
||||
LL | pub fn try_foo(x: impl Bar){}
|
||||
LL | pub fn try_foo(x: impl Bar) {}
|
||||
| --- required by this bound in `main::a::try_foo`
|
||||
|
|
||||
help: Trait impl with same name found
|
||||
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
|
||||
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`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue