about summary refs log tree commit diff
path: root/tests/ui/traits/bound/same-crate-name.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/traits/bound/same-crate-name.rs')
-rw-r--r--tests/ui/traits/bound/same-crate-name.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/ui/traits/bound/same-crate-name.rs b/tests/ui/traits/bound/same-crate-name.rs
new file mode 100644
index 00000000000..8d646a41459
--- /dev/null
+++ b/tests/ui/traits/bound/same-crate-name.rs
@@ -0,0 +1,55 @@
+// aux-build:crate_a1.rs
+// aux-build:crate_a2.rs
+
+// Issue 22750
+// This tests the extra help message reported when a trait bound
+// is not met but the struct implements a trait with the same path.
+
+fn main() {
+    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(foo);
+        //~^ ERROR E0277
+        //~| 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 trait `main::a::Bar` is implemented for `ImplementsTraitForUsize<usize>`
+    }
+}