diff options
| author | Timo Freiberg <timo.freiberg@gmail.com> | 2019-11-24 13:01:13 +0100 |
|---|---|---|
| committer | Timo Freiberg <timo.freiberg@gmail.com> | 2019-11-24 15:17:16 +0100 |
| commit | 318fb9a4da8adc4451b1e44ee823576e32eb437f (patch) | |
| tree | f7c128561c187e745ddcfea61337717c03a5e85d | |
| parent | dffdf378ee6950a7ecd8d5c235e6ad891b5bc4b8 (diff) | |
| download | rust-318fb9a4da8adc4451b1e44ee823576e32eb437f.tar.gz rust-318fb9a4da8adc4451b1e44ee823576e32eb437f.zip | |
fixup! Add negative tests where the diagnostic message would be wrong
| -rw-r--r-- | src/test/ui/traits/auxiliary/crate_a1.rs | 10 | ||||
| -rw-r--r-- | src/test/ui/traits/auxiliary/crate_a2.rs | 10 | ||||
| -rw-r--r-- | src/test/ui/traits/trait-bounds-same-crate-name.rs | 40 | ||||
| -rw-r--r-- | src/test/ui/traits/trait-bounds-same-crate-name.stderr | 57 |
4 files changed, 103 insertions, 14 deletions
diff --git a/src/test/ui/traits/auxiliary/crate_a1.rs b/src/test/ui/traits/auxiliary/crate_a1.rs index 724206860fe..6aa010258eb 100644 --- a/src/test/ui/traits/auxiliary/crate_a1.rs +++ b/src/test/ui/traits/auxiliary/crate_a1.rs @@ -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> {} diff --git a/src/test/ui/traits/auxiliary/crate_a2.rs b/src/test/ui/traits/auxiliary/crate_a2.rs index d8a178dc0d9..d6057db5e63 100644 --- a/src/test/ui/traits/auxiliary/crate_a2.rs +++ b/src/test/ui/traits/auxiliary/crate_a2.rs @@ -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> {} diff --git a/src/test/ui/traits/trait-bounds-same-crate-name.rs b/src/test/ui/traits/trait-bounds-same-crate-name.rs index 2ef1c989a56..af720ecfdc0 100644 --- a/src/test/ui/traits/trait-bounds-same-crate-name.rs +++ b/src/test/ui/traits/trait-bounds-same-crate-name.rs @@ -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: } } diff --git a/src/test/ui/traits/trait-bounds-same-crate-name.stderr b/src/test/ui/traits/trait-bounds-same-crate-name.stderr index 78ea9a849f4..8fd0bd13e54 100644 --- a/src/test/ui/traits/trait-bounds-same-crate-name.stderr +++ b/src/test/ui/traits/trait-bounds-same-crate-name.stderr @@ -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`. |
