Skip to content

Commit

Permalink
fixup! Add negative tests where the diagnostic message would be wrong
Browse files Browse the repository at this point in the history
  • Loading branch information
TimoFreiberg committed Nov 24, 2019
1 parent dffdf37 commit 318fb9a
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 14 deletions.
10 changes: 7 additions & 3 deletions src/test/ui/traits/auxiliary/crate_a1.rs
Original file line number Diff line number Diff line change
@@ -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> {}
10 changes: 9 additions & 1 deletion src/test/ui/traits/auxiliary/crate_a2.rs
Original file line number Diff line number Diff line change
@@ -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> {}
40 changes: 37 additions & 3 deletions src/test/ui/traits/trait-bounds-same-crate-name.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
}
}
57 changes: 50 additions & 7 deletions src/test/ui/traits/trait-bounds-same-crate-name.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 318fb9a

Please sign in to comment.