]> git.lizzy.rs Git - rust.git/commitdiff
fixup! Add negative tests where the diagnostic message would be wrong
authorTimo Freiberg <timo.freiberg@gmail.com>
Sun, 24 Nov 2019 12:01:13 +0000 (13:01 +0100)
committerTimo Freiberg <timo.freiberg@gmail.com>
Sun, 24 Nov 2019 14:17:16 +0000 (15:17 +0100)
src/test/ui/traits/auxiliary/crate_a1.rs
src/test/ui/traits/auxiliary/crate_a2.rs
src/test/ui/traits/trait-bounds-same-crate-name.rs
src/test/ui/traits/trait-bounds-same-crate-name.stderr

index 724206860fe501408281b38ae285e553d119e730..6aa010258ebd5c6b15a24f30f1caa7ad6aed5dcf 100644 (file)
@@ -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> {}
index d8a178dc0d90e966b6b95d6f31c5fb0be25a5909..d6057db5e63f1644a544d4f8a023ea1270effb90 100644 (file)
@@ -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> {}
index 2ef1c989a5661fd8a741aa2cd671166de9b784bc..af720ecfdc063fe43291b8676c4d2726a187a4dd 100644 (file)
@@ -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:
     }
 }
index 78ea9a849f437235ce5dc97bab5b678bdaab1abf..8fd0bd13e54b385743bf66ce00d02f0901e32ffc 100644 (file)
@@ -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`.