about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTimo Freiberg <timo.freiberg@gmail.com>2019-11-24 13:01:13 +0100
committerTimo Freiberg <timo.freiberg@gmail.com>2019-11-24 15:17:16 +0100
commit318fb9a4da8adc4451b1e44ee823576e32eb437f (patch)
treef7c128561c187e745ddcfea61337717c03a5e85d
parentdffdf378ee6950a7ecd8d5c235e6ad891b5bc4b8 (diff)
downloadrust-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.rs10
-rw-r--r--src/test/ui/traits/auxiliary/crate_a2.rs10
-rw-r--r--src/test/ui/traits/trait-bounds-same-crate-name.rs40
-rw-r--r--src/test/ui/traits/trait-bounds-same-crate-name.stderr57
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`.