diff --git a/tests/ui/suggestions/restrict-bound-already-has-generic-args.rs b/tests/ui/suggestions/restrict-bound-already-has-generic-args.rs
new file mode 100644
index 0000000000000..0350ef50705d9
--- /dev/null
+++ b/tests/ui/suggestions/restrict-bound-already-has-generic-args.rs
@@ -0,0 +1,27 @@
+// Regression test for https://github.com/rust-lang/rust/issues/142803.
+
+trait Pair {
+ type Left;
+ type Right;
+
+ fn split(self) -> (Self::Left, Self::Right);
+}
+
+impl Pair for (A, B) {
+ type Left = A;
+ type Right = B;
+
+ fn split(self) -> (Self::Left, Self::Right) {
+ self
+ }
+}
+
+fn frob(pair: impl Pair) -> impl Pair {
+ //~^ ERROR type mismatch
+ //~| HELP consider further restricting this bound
+ //~| SUGGESTION , Right = B
+ let (left, right) = pair.split();
+ (left, right)
+}
+
+fn main() {}
diff --git a/tests/ui/suggestions/restrict-bound-already-has-generic-args.stderr b/tests/ui/suggestions/restrict-bound-already-has-generic-args.stderr
new file mode 100644
index 0000000000000..a284f2adb366c
--- /dev/null
+++ b/tests/ui/suggestions/restrict-bound-already-has-generic-args.stderr
@@ -0,0 +1,24 @@
+error[E0271]: type mismatch resolving `<(A, as Pair>::Right) as Pair>::Right == B`
+ --> $DIR/restrict-bound-already-has-generic-args.rs:19:45
+ |
+LL | fn frob(pair: impl Pair) -> impl Pair {
+ | - expected this type parameter ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `<(A, as Pair>::Right) as Pair>::Right == B`
+...
+LL | (left, right)
+ | ------------- return type was inferred to be `(A, as Pair>::Right)` here
+ |
+note: expected this to be `B`
+ --> $DIR/restrict-bound-already-has-generic-args.rs:12:18
+ |
+LL | type Right = B;
+ | ^
+ = note: expected type parameter `B`
+ found associated type ` as Pair>::Right`
+help: consider further restricting this bound
+ |
+LL | fn frob(pair: impl Pair) -> impl Pair {
+ | +++++++++++
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0271`.