summary refs log tree commit diff
path: root/tests/ui/compare-method
diff options
context:
space:
mode:
authorAlbert Larsan <74931857+albertlarsan68@users.noreply.github.com>2023-01-05 09:13:28 +0100
committerAlbert Larsan <74931857+albertlarsan68@users.noreply.github.com>2023-01-11 09:32:08 +0000
commitcf2dff2b1e3fa55fa5415d524200070d0d7aacfe (patch)
tree40a88d9a46aaf3e8870676eb2538378b75a263eb /tests/ui/compare-method
parentca855e6e42787ecd062d81d53336fe6788ef51a9 (diff)
downloadrust-cf2dff2b1e3fa55fa5415d524200070d0d7aacfe.tar.gz
rust-cf2dff2b1e3fa55fa5415d524200070d0d7aacfe.zip
Move /src/test to /tests
Diffstat (limited to 'tests/ui/compare-method')
-rw-r--r--tests/ui/compare-method/bad-self-type.rs26
-rw-r--r--tests/ui/compare-method/bad-self-type.stderr50
-rw-r--r--tests/ui/compare-method/issue-90444.rs17
-rw-r--r--tests/ui/compare-method/issue-90444.stderr27
-rw-r--r--tests/ui/compare-method/proj-outlives-region.rs14
-rw-r--r--tests/ui/compare-method/proj-outlives-region.stderr12
-rw-r--r--tests/ui/compare-method/region-extra-2.rs15
-rw-r--r--tests/ui/compare-method/region-extra-2.stderr17
-rw-r--r--tests/ui/compare-method/region-extra.rs14
-rw-r--r--tests/ui/compare-method/region-extra.stderr18
-rw-r--r--tests/ui/compare-method/region-unrelated.rs15
-rw-r--r--tests/ui/compare-method/region-unrelated.stderr12
-rw-r--r--tests/ui/compare-method/reordered-type-param.rs19
-rw-r--r--tests/ui/compare-method/reordered-type-param.stderr24
-rw-r--r--tests/ui/compare-method/trait-bound-on-type-parameter.rs18
-rw-r--r--tests/ui/compare-method/trait-bound-on-type-parameter.stderr12
-rw-r--r--tests/ui/compare-method/traits-misc-mismatch-1.rs71
-rw-r--r--tests/ui/compare-method/traits-misc-mismatch-1.stderr66
-rw-r--r--tests/ui/compare-method/traits-misc-mismatch-2.rs23
-rw-r--r--tests/ui/compare-method/traits-misc-mismatch-2.stderr12
20 files changed, 482 insertions, 0 deletions
diff --git a/tests/ui/compare-method/bad-self-type.rs b/tests/ui/compare-method/bad-self-type.rs
new file mode 100644
index 00000000000..f42a9e49abd
--- /dev/null
+++ b/tests/ui/compare-method/bad-self-type.rs
@@ -0,0 +1,26 @@
+use std::future::Future;
+use std::task::{Context, Poll};
+
+fn main() {}
+
+struct MyFuture {}
+
+impl Future for MyFuture {
+    type Output = ();
+    fn poll(self, _: &mut Context<'_>) -> Poll<()> {
+    //~^ ERROR method `poll` has an incompatible type for trait
+        todo!()
+    }
+}
+
+trait T {
+    fn foo(self);
+    fn bar(self) -> Option<()>;
+}
+
+impl T for MyFuture {
+    fn foo(self: Box<Self>) {}
+    //~^ ERROR method `foo` has an incompatible type for trait
+    fn bar(self) {}
+    //~^ ERROR method `bar` has an incompatible type for trait
+}
diff --git a/tests/ui/compare-method/bad-self-type.stderr b/tests/ui/compare-method/bad-self-type.stderr
new file mode 100644
index 00000000000..cad942e646e
--- /dev/null
+++ b/tests/ui/compare-method/bad-self-type.stderr
@@ -0,0 +1,50 @@
+error[E0053]: method `poll` has an incompatible type for trait
+  --> $DIR/bad-self-type.rs:10:13
+   |
+LL |     fn poll(self, _: &mut Context<'_>) -> Poll<()> {
+   |             ^^^^
+   |             |
+   |             expected struct `Pin`, found struct `MyFuture`
+   |             help: change the self-receiver type to match the trait: `self: Pin<&mut MyFuture>`
+   |
+   = note: expected signature `fn(Pin<&mut MyFuture>, &mut Context<'_>) -> Poll<_>`
+              found signature `fn(MyFuture, &mut Context<'_>) -> Poll<_>`
+
+error[E0053]: method `foo` has an incompatible type for trait
+  --> $DIR/bad-self-type.rs:22:18
+   |
+LL |     fn foo(self: Box<Self>) {}
+   |            ------^^^^^^^^^
+   |            |     |
+   |            |     expected struct `MyFuture`, found struct `Box`
+   |            help: change the self-receiver type to match the trait: `self`
+   |
+note: type in trait
+  --> $DIR/bad-self-type.rs:17:12
+   |
+LL |     fn foo(self);
+   |            ^^^^
+   = note: expected signature `fn(MyFuture)`
+              found signature `fn(Box<MyFuture>)`
+
+error[E0053]: method `bar` has an incompatible type for trait
+  --> $DIR/bad-self-type.rs:24:18
+   |
+LL |     fn bar(self) {}
+   |                  ^ expected enum `Option`, found `()`
+   |
+note: type in trait
+  --> $DIR/bad-self-type.rs:18:21
+   |
+LL |     fn bar(self) -> Option<()>;
+   |                     ^^^^^^^^^^
+   = note: expected signature `fn(MyFuture) -> Option<()>`
+              found signature `fn(MyFuture)`
+help: change the output type to match the trait
+   |
+LL |     fn bar(self) -> Option<()> {}
+   |                  +++++++++++++
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0053`.
diff --git a/tests/ui/compare-method/issue-90444.rs b/tests/ui/compare-method/issue-90444.rs
new file mode 100644
index 00000000000..6c287d9a707
--- /dev/null
+++ b/tests/ui/compare-method/issue-90444.rs
@@ -0,0 +1,17 @@
+pub struct A;
+impl From<fn((), (), &())> for A {
+    fn from(_: fn((), (), &mut ())) -> Self {
+        //~^ error: method `from` has an incompatible type for trait
+        loop {}
+    }
+}
+
+pub struct B;
+impl From<fn((), (), u32)> for B {
+    fn from(_: fn((), (), u64)) -> Self {
+        //~^ error: method `from` has an incompatible type for trait
+        loop {}
+    }
+}
+
+fn main() {}
diff --git a/tests/ui/compare-method/issue-90444.stderr b/tests/ui/compare-method/issue-90444.stderr
new file mode 100644
index 00000000000..52e23d03b14
--- /dev/null
+++ b/tests/ui/compare-method/issue-90444.stderr
@@ -0,0 +1,27 @@
+error[E0053]: method `from` has an incompatible type for trait
+  --> $DIR/issue-90444.rs:3:16
+   |
+LL |     fn from(_: fn((), (), &mut ())) -> Self {
+   |                ^^^^^^^^^^^^^^^^^^^
+   |                |
+   |                types differ in mutability
+   |                help: change the parameter type to match the trait: `for<'a> fn((), (), &'a ())`
+   |
+   = note: expected signature `fn(for<'a> fn((), (), &'a ())) -> A`
+              found signature `fn(for<'a> fn((), (), &'a mut ())) -> A`
+
+error[E0053]: method `from` has an incompatible type for trait
+  --> $DIR/issue-90444.rs:11:16
+   |
+LL |     fn from(_: fn((), (), u64)) -> Self {
+   |                ^^^^^^^^^^^^^^^
+   |                |
+   |                expected `u32`, found `u64`
+   |                help: change the parameter type to match the trait: `fn((), (), u32)`
+   |
+   = note: expected signature `fn(fn((), (), u32)) -> B`
+              found signature `fn(fn((), (), u64)) -> B`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0053`.
diff --git a/tests/ui/compare-method/proj-outlives-region.rs b/tests/ui/compare-method/proj-outlives-region.rs
new file mode 100644
index 00000000000..969bc566d38
--- /dev/null
+++ b/tests/ui/compare-method/proj-outlives-region.rs
@@ -0,0 +1,14 @@
+// Test that we elaborate `Type: 'region` constraints and infer various important things.
+
+trait Master<'a, T: ?Sized, U> {
+    fn foo() where T: 'a;
+}
+
+// `U::Item: 'a` does not imply that `U: 'a`
+impl<'a, U: Iterator> Master<'a, U::Item, U> for () {
+    fn foo() where U: 'a { } //~ ERROR E0276
+}
+
+fn main() {
+    println!("Hello, world!");
+}
diff --git a/tests/ui/compare-method/proj-outlives-region.stderr b/tests/ui/compare-method/proj-outlives-region.stderr
new file mode 100644
index 00000000000..797a8167931
--- /dev/null
+++ b/tests/ui/compare-method/proj-outlives-region.stderr
@@ -0,0 +1,12 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/proj-outlives-region.rs:9:23
+   |
+LL |     fn foo() where T: 'a;
+   |     --------------------- definition of `foo` from trait
+...
+LL |     fn foo() where U: 'a { }
+   |                       ^^ impl has extra requirement `U: 'a`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0276`.
diff --git a/tests/ui/compare-method/region-extra-2.rs b/tests/ui/compare-method/region-extra-2.rs
new file mode 100644
index 00000000000..3d57b544e16
--- /dev/null
+++ b/tests/ui/compare-method/region-extra-2.rs
@@ -0,0 +1,15 @@
+// Regression test for issue #22779. An extra where clause was
+// permitted on the impl that is not present on the trait.
+
+trait Tr<'a, T> {
+    fn renew<'b: 'a>(self) -> &'b mut [T];
+}
+
+impl<'a, T> Tr<'a, T> for &'a mut [T] {
+    fn renew<'b: 'a>(self) -> &'b mut [T] where 'a: 'b {
+        //~^ ERROR E0276
+        &mut self[..]
+    }
+}
+
+fn main() { }
diff --git a/tests/ui/compare-method/region-extra-2.stderr b/tests/ui/compare-method/region-extra-2.stderr
new file mode 100644
index 00000000000..eb19d57ab05
--- /dev/null
+++ b/tests/ui/compare-method/region-extra-2.stderr
@@ -0,0 +1,17 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/region-extra-2.rs:9:53
+   |
+LL |     fn renew<'b: 'a>(self) -> &'b mut [T];
+   |     -------------------------------------- definition of `renew` from trait
+...
+LL |     fn renew<'b: 'a>(self) -> &'b mut [T] where 'a: 'b {
+   |                                                     ^^ impl has extra requirement `'a: 'b`
+   |
+help: copy the `where` clause predicates from the trait
+   |
+LL |     fn renew<'b: 'a>(self) -> &'b mut [T] where 'b: 'a {
+   |                                           ~~~~~~~~~~~~
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0276`.
diff --git a/tests/ui/compare-method/region-extra.rs b/tests/ui/compare-method/region-extra.rs
new file mode 100644
index 00000000000..1070cb84512
--- /dev/null
+++ b/tests/ui/compare-method/region-extra.rs
@@ -0,0 +1,14 @@
+// Test that you cannot add an extra where clause in the impl relating
+// two regions.
+
+trait Master<'a, 'b> {
+    fn foo();
+}
+
+impl<'a, 'b> Master<'a, 'b> for () {
+    fn foo() where 'a: 'b { } //~ ERROR impl has stricter
+}
+
+fn main() {
+    println!("Hello, world!");
+}
diff --git a/tests/ui/compare-method/region-extra.stderr b/tests/ui/compare-method/region-extra.stderr
new file mode 100644
index 00000000000..1a471e18d9d
--- /dev/null
+++ b/tests/ui/compare-method/region-extra.stderr
@@ -0,0 +1,18 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/region-extra.rs:9:24
+   |
+LL |     fn foo();
+   |     --------- definition of `foo` from trait
+...
+LL |     fn foo() where 'a: 'b { }
+   |                        ^^ impl has extra requirement `'a: 'b`
+   |
+help: remove the `where` clause
+   |
+LL -     fn foo() where 'a: 'b { }
+LL +     fn foo()  { }
+   |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0276`.
diff --git a/tests/ui/compare-method/region-unrelated.rs b/tests/ui/compare-method/region-unrelated.rs
new file mode 100644
index 00000000000..9730c9dfe6c
--- /dev/null
+++ b/tests/ui/compare-method/region-unrelated.rs
@@ -0,0 +1,15 @@
+// Test that we elaborate `Type: 'region` constraints and infer various important things.
+
+trait Master<'a, T: ?Sized, U> {
+    fn foo() where T: 'a;
+}
+
+// `U: 'a` does not imply `V: 'a`
+impl<'a, U, V> Master<'a, U, V> for () {
+    fn foo() where V: 'a { }
+    //~^ ERROR impl has stricter requirements than trait
+}
+
+fn main() {
+    println!("Hello, world!");
+}
diff --git a/tests/ui/compare-method/region-unrelated.stderr b/tests/ui/compare-method/region-unrelated.stderr
new file mode 100644
index 00000000000..f7ae6f94438
--- /dev/null
+++ b/tests/ui/compare-method/region-unrelated.stderr
@@ -0,0 +1,12 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/region-unrelated.rs:9:23
+   |
+LL |     fn foo() where T: 'a;
+   |     --------------------- definition of `foo` from trait
+...
+LL |     fn foo() where V: 'a { }
+   |                       ^^ impl has extra requirement `V: 'a`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0276`.
diff --git a/tests/ui/compare-method/reordered-type-param.rs b/tests/ui/compare-method/reordered-type-param.rs
new file mode 100644
index 00000000000..a858b66d760
--- /dev/null
+++ b/tests/ui/compare-method/reordered-type-param.rs
@@ -0,0 +1,19 @@
+// Tests that ty params get matched correctly when comparing
+// an impl against a trait
+//
+// cc #26111
+
+trait A {
+  fn b<C:Clone,D>(&self, x: C) -> C;
+}
+
+struct E {
+ f: isize
+}
+
+impl A for E {
+  // n.b. The error message is awful -- see #3404
+  fn b<F:Clone,G>(&self, _x: G) -> G { panic!() } //~ ERROR method `b` has an incompatible type
+}
+
+fn main() {}
diff --git a/tests/ui/compare-method/reordered-type-param.stderr b/tests/ui/compare-method/reordered-type-param.stderr
new file mode 100644
index 00000000000..1552d542d15
--- /dev/null
+++ b/tests/ui/compare-method/reordered-type-param.stderr
@@ -0,0 +1,24 @@
+error[E0053]: method `b` has an incompatible type for trait
+  --> $DIR/reordered-type-param.rs:16:30
+   |
+LL |   fn b<F:Clone,G>(&self, _x: G) -> G { panic!() }
+   |        -       -             ^
+   |        |       |             |
+   |        |       |             expected type parameter `F`, found type parameter `G`
+   |        |       |             help: change the parameter type to match the trait: `F`
+   |        |       found type parameter
+   |        expected type parameter
+   |
+note: type in trait
+  --> $DIR/reordered-type-param.rs:7:29
+   |
+LL |   fn b<C:Clone,D>(&self, x: C) -> C;
+   |                             ^
+   = note: expected signature `fn(&E, F) -> F`
+              found signature `fn(&E, G) -> G`
+   = note: a type parameter was expected, but a different one was found; you might be missing a type parameter or trait bound
+   = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0053`.
diff --git a/tests/ui/compare-method/trait-bound-on-type-parameter.rs b/tests/ui/compare-method/trait-bound-on-type-parameter.rs
new file mode 100644
index 00000000000..5359001ea43
--- /dev/null
+++ b/tests/ui/compare-method/trait-bound-on-type-parameter.rs
@@ -0,0 +1,18 @@
+// Tests that impl can't add extra `F: Sync` bound aren't *more* restrictive
+// than the trait method it's implementing.
+//
+// Regr test for #26111.
+
+trait A {
+  fn b<C,D>(&self, x: C) -> C;
+}
+
+struct E {
+ f: isize
+}
+
+impl A for E {
+    fn b<F: Sync, G>(&self, _x: F) -> F { panic!() } //~ ERROR E0276
+}
+
+fn main() {}
diff --git a/tests/ui/compare-method/trait-bound-on-type-parameter.stderr b/tests/ui/compare-method/trait-bound-on-type-parameter.stderr
new file mode 100644
index 00000000000..ce6885c1541
--- /dev/null
+++ b/tests/ui/compare-method/trait-bound-on-type-parameter.stderr
@@ -0,0 +1,12 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/trait-bound-on-type-parameter.rs:15:13
+   |
+LL |   fn b<C,D>(&self, x: C) -> C;
+   |   ---------------------------- definition of `b` from trait
+...
+LL |     fn b<F: Sync, G>(&self, _x: F) -> F { panic!() }
+   |             ^^^^ impl has extra requirement `F: Sync`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0276`.
diff --git a/tests/ui/compare-method/traits-misc-mismatch-1.rs b/tests/ui/compare-method/traits-misc-mismatch-1.rs
new file mode 100644
index 00000000000..0da4aba303c
--- /dev/null
+++ b/tests/ui/compare-method/traits-misc-mismatch-1.rs
@@ -0,0 +1,71 @@
+//
+// Make sure rustc checks the type parameter bounds in implementations of traits,
+// see #2687
+
+use std::marker;
+
+trait A { }
+
+trait B: A {}
+
+trait C: A {}
+
+trait Foo {
+    fn test_error1_fn<T: Eq>(&self);
+    fn test_error2_fn<T: Eq + Ord>(&self);
+    fn test_error3_fn<T: Eq + Ord>(&self);
+    fn test3_fn<T: Eq + Ord>(&self);
+    fn test4_fn<T: Eq + Ord>(&self);
+    fn test_error5_fn<T: A>(&self);
+    fn test6_fn<T: A + Eq>(&self);
+    fn test_error7_fn<T: A>(&self);
+    fn test_error8_fn<T: B>(&self);
+}
+
+impl Foo for isize {
+    // invalid bound for T, was defined as Eq in trait
+    fn test_error1_fn<T: Ord>(&self) {}
+    //~^ ERROR E0276
+
+    // invalid bound for T, was defined as Eq + Ord in trait
+    fn test_error2_fn<T: Eq + B>(&self) {}
+    //~^ ERROR E0276
+
+    // invalid bound for T, was defined as Eq + Ord in trait
+    fn test_error3_fn<T: B + Eq>(&self) {}
+    //~^ ERROR E0276
+
+    // multiple bounds, same order as in trait
+    fn test3_fn<T: Ord + Eq>(&self) {}
+
+    // multiple bounds, different order as in trait
+    fn test4_fn<T: Eq + Ord>(&self) {}
+
+    // parameters in impls must be equal or more general than in the defining trait
+    fn test_error5_fn<T: B>(&self) {}
+    //~^ ERROR E0276
+
+    // bound `std::cmp::Eq` not enforced by this implementation, but this is OK
+    fn test6_fn<T: A>(&self) {}
+
+    fn test_error7_fn<T: A + Eq>(&self) {}
+    //~^ ERROR E0276
+
+    fn test_error8_fn<T: C>(&self) {}
+    //~^ ERROR E0276
+}
+
+trait Getter<T> {
+    fn get(&self) -> T { loop { } }
+}
+
+trait Trait {
+    fn method<G:Getter<isize>>(&self);
+}
+
+impl Trait for usize {
+    fn method<G: Getter<usize>>(&self) {}
+    //~^ ERROR E0276
+}
+
+fn main() {}
diff --git a/tests/ui/compare-method/traits-misc-mismatch-1.stderr b/tests/ui/compare-method/traits-misc-mismatch-1.stderr
new file mode 100644
index 00000000000..805c04536ca
--- /dev/null
+++ b/tests/ui/compare-method/traits-misc-mismatch-1.stderr
@@ -0,0 +1,66 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:27:26
+   |
+LL |     fn test_error1_fn<T: Eq>(&self);
+   |     -------------------------------- definition of `test_error1_fn` from trait
+...
+LL |     fn test_error1_fn<T: Ord>(&self) {}
+   |                          ^^^ impl has extra requirement `T: Ord`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:31:31
+   |
+LL |     fn test_error2_fn<T: Eq + Ord>(&self);
+   |     -------------------------------------- definition of `test_error2_fn` from trait
+...
+LL |     fn test_error2_fn<T: Eq + B>(&self) {}
+   |                               ^ impl has extra requirement `T: B`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:35:26
+   |
+LL |     fn test_error3_fn<T: Eq + Ord>(&self);
+   |     -------------------------------------- definition of `test_error3_fn` from trait
+...
+LL |     fn test_error3_fn<T: B + Eq>(&self) {}
+   |                          ^ impl has extra requirement `T: B`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:45:26
+   |
+LL |     fn test_error5_fn<T: A>(&self);
+   |     ------------------------------- definition of `test_error5_fn` from trait
+...
+LL |     fn test_error5_fn<T: B>(&self) {}
+   |                          ^ impl has extra requirement `T: B`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:51:30
+   |
+LL |     fn test_error7_fn<T: A>(&self);
+   |     ------------------------------- definition of `test_error7_fn` from trait
+...
+LL |     fn test_error7_fn<T: A + Eq>(&self) {}
+   |                              ^^ impl has extra requirement `T: Eq`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:54:26
+   |
+LL |     fn test_error8_fn<T: B>(&self);
+   |     ------------------------------- definition of `test_error8_fn` from trait
+...
+LL |     fn test_error8_fn<T: C>(&self) {}
+   |                          ^ impl has extra requirement `T: C`
+
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-1.rs:67:18
+   |
+LL |     fn method<G:Getter<isize>>(&self);
+   |     ---------------------------------- definition of `method` from trait
+...
+LL |     fn method<G: Getter<usize>>(&self) {}
+   |                  ^^^^^^^^^^^^^ impl has extra requirement `G: Getter<usize>`
+
+error: aborting due to 7 previous errors
+
+For more information about this error, try `rustc --explain E0276`.
diff --git a/tests/ui/compare-method/traits-misc-mismatch-2.rs b/tests/ui/compare-method/traits-misc-mismatch-2.rs
new file mode 100644
index 00000000000..d7f31c1d971
--- /dev/null
+++ b/tests/ui/compare-method/traits-misc-mismatch-2.rs
@@ -0,0 +1,23 @@
+// Issue #5886: a complex instance of issue #2687.
+
+trait Iterator<A> {
+    fn next(&mut self) -> Option<A>;
+}
+
+trait IteratorUtil<A>: Sized
+{
+    fn zip<B, U: Iterator<U>>(self, other: U) -> ZipIterator<Self, U>;
+}
+
+impl<A, T: Iterator<A>> IteratorUtil<A> for T {
+    fn zip<B, U: Iterator<B>>(self, other: U) -> ZipIterator<T, U> {
+    //~^ ERROR E0276
+        ZipIterator{a: self, b: other}
+    }
+}
+
+struct ZipIterator<T, U> {
+    a: T, b: U
+}
+
+fn main() {}
diff --git a/tests/ui/compare-method/traits-misc-mismatch-2.stderr b/tests/ui/compare-method/traits-misc-mismatch-2.stderr
new file mode 100644
index 00000000000..36bb764d40e
--- /dev/null
+++ b/tests/ui/compare-method/traits-misc-mismatch-2.stderr
@@ -0,0 +1,12 @@
+error[E0276]: impl has stricter requirements than trait
+  --> $DIR/traits-misc-mismatch-2.rs:13:18
+   |
+LL |     fn zip<B, U: Iterator<U>>(self, other: U) -> ZipIterator<Self, U>;
+   |     ------------------------------------------------------------------ definition of `zip` from trait
+...
+LL |     fn zip<B, U: Iterator<B>>(self, other: U) -> ZipIterator<T, U> {
+   |                  ^^^^^^^^^^^ impl has extra requirement `U: Iterator<B>`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0276`.