diff --git a/src/test/ui/associated-types/issue-87261.rs b/src/test/ui/associated-types/issue-87261.rs
new file mode 100644
index 000000000000..a70f771e4826
--- /dev/null
+++ b/src/test/ui/associated-types/issue-87261.rs
@@ -0,0 +1,99 @@
+trait Foo {}
+
+trait Trait {
+ type Associated;
+}
+trait DerivedTrait: Trait {}
+trait GenericTrait {
+ type Associated;
+}
+
+struct Impl;
+impl Foo for Impl {}
+impl Trait for Impl {
+ type Associated = ();
+}
+impl DerivedTrait for Impl {}
+impl GenericTrait for Impl {
+ type Associated = ();
+}
+
+fn returns_opaque() -> impl Trait + 'static {
+ Impl
+}
+fn returns_opaque_derived() -> impl DerivedTrait + 'static {
+ Impl
+}
+fn returns_opaque_foo() -> impl Trait + Foo {
+ Impl
+}
+fn returns_opaque_derived_foo() -> impl DerivedTrait + Foo {
+ Impl
+}
+fn returns_opaque_generic() -> impl GenericTrait<()> + 'static {
+ Impl
+}
+fn returns_opaque_generic_foo() -> impl GenericTrait<()> + Foo {
+ Impl
+}
+fn returns_opaque_generic_duplicate() -> impl GenericTrait<()> + GenericTrait {
+ Impl
+}
+
+fn accepts_trait>(_: T) {}
+fn accepts_generic_trait>(_: T) {}
+
+fn check_generics(a: A, b: B, c: C, d: D, e: E, f: F, g: G)
+where
+ A: Trait + 'static,
+ B: DerivedTrait + 'static,
+ C: Trait + Foo,
+ D: DerivedTrait + Foo,
+ E: GenericTrait<()> + 'static,
+ F: GenericTrait<()> + Foo,
+ G: GenericTrait<()> + GenericTrait,
+{
+ accepts_trait(a);
+ //~^ ERROR type mismatch resolving `::Associated == ()`
+
+ accepts_trait(b);
+ //~^ ERROR type mismatch resolving `::Associated == ()`
+
+ accepts_trait(c);
+ //~^ ERROR type mismatch resolving `::Associated == ()`
+
+ accepts_trait(d);
+ //~^ ERROR type mismatch resolving `::Associated == ()`
+
+ accepts_generic_trait(e);
+ //~^ ERROR type mismatch resolving `>::Associated == ()`
+
+ accepts_generic_trait(f);
+ //~^ ERROR type mismatch resolving `>::Associated == ()`
+
+ accepts_generic_trait(g);
+ //~^ ERROR type mismatch resolving `>::Associated == ()`
+}
+
+fn main() {
+ accepts_trait(returns_opaque());
+ //~^ ERROR type mismatch resolving `::Associated == ()`
+
+ accepts_trait(returns_opaque_derived());
+ //~^ ERROR type mismatch resolving `::Associated == ()`
+
+ accepts_trait(returns_opaque_foo());
+ //~^ ERROR type mismatch resolving `::Associated == ()`
+
+ accepts_trait(returns_opaque_derived_foo());
+ //~^ ERROR type mismatch resolving `::Associated == ()`
+
+ accepts_generic_trait(returns_opaque_generic());
+ //~^ ERROR type mismatch resolving ` as GenericTrait<()>>::Associated == ()`
+
+ accepts_generic_trait(returns_opaque_generic_foo());
+ //~^ ERROR type mismatch resolving `+Foo as GenericTrait<()>>::Associated == ()`
+
+ accepts_generic_trait(returns_opaque_generic_duplicate());
+ //~^ ERROR type mismatch resolving `+GenericTrait as GenericTrait<()>>::Associated == ()`
+}
diff --git a/src/test/ui/associated-types/issue-87261.stderr b/src/test/ui/associated-types/issue-87261.stderr
new file mode 100644
index 000000000000..0725acfe537d
--- /dev/null
+++ b/src/test/ui/associated-types/issue-87261.stderr
@@ -0,0 +1,238 @@
+error[E0271]: type mismatch resolving `::Associated == ()`
+ --> $DIR/issue-87261.rs:56:5
+ |
+LL | fn accepts_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_trait`
+...
+LL | accepts_trait(a);
+ | ^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `::Associated`
+help: consider constraining the associated type `::Associated` to `()`
+ |
+LL | A: Trait + 'static,
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `::Associated == ()`
+ --> $DIR/issue-87261.rs:59:5
+ |
+LL | fn accepts_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_trait`
+...
+LL | accepts_trait(b);
+ | ^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `::Associated`
+ = help: consider constraining the associated type `::Associated` to `()`
+ = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
+
+error[E0271]: type mismatch resolving `::Associated == ()`
+ --> $DIR/issue-87261.rs:62:5
+ |
+LL | fn accepts_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_trait`
+...
+LL | accepts_trait(c);
+ | ^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `::Associated`
+help: consider constraining the associated type `::Associated` to `()`
+ |
+LL | C: Trait + Foo,
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `::Associated == ()`
+ --> $DIR/issue-87261.rs:65:5
+ |
+LL | fn accepts_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_trait`
+...
+LL | accepts_trait(d);
+ | ^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `::Associated`
+ = help: consider constraining the associated type `::Associated` to `()`
+ = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
+
+error[E0271]: type mismatch resolving `>::Associated == ()`
+ --> $DIR/issue-87261.rs:68:5
+ |
+LL | fn accepts_generic_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_generic_trait`
+...
+LL | accepts_generic_trait(e);
+ | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `>::Associated`
+help: consider constraining the associated type `>::Associated` to `()`
+ |
+LL | E: GenericTrait<(), Associated = ()> + 'static,
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `>::Associated == ()`
+ --> $DIR/issue-87261.rs:71:5
+ |
+LL | fn accepts_generic_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_generic_trait`
+...
+LL | accepts_generic_trait(f);
+ | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `>::Associated`
+help: consider constraining the associated type `>::Associated` to `()`
+ |
+LL | F: GenericTrait<(), Associated = ()> + Foo,
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `>::Associated == ()`
+ --> $DIR/issue-87261.rs:74:5
+ |
+LL | fn accepts_generic_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_generic_trait`
+...
+LL | accepts_generic_trait(g);
+ | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `>::Associated`
+ = help: consider constraining the associated type `>::Associated` to `()`
+ = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
+
+error[E0271]: type mismatch resolving `::Associated == ()`
+ --> $DIR/issue-87261.rs:79:5
+ |
+LL | fn returns_opaque() -> impl Trait + 'static {
+ | -------------------- the found opaque type
+...
+LL | fn accepts_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_trait`
+...
+LL | accepts_trait(returns_opaque());
+ | ^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `::Associated`
+help: consider constraining the associated type `::Associated` to `()`
+ |
+LL | fn returns_opaque() -> impl Trait + 'static {
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `::Associated == ()`
+ --> $DIR/issue-87261.rs:82:5
+ |
+LL | fn returns_opaque_derived() -> impl DerivedTrait + 'static {
+ | --------------------------- the found opaque type
+...
+LL | fn accepts_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_trait`
+...
+LL | accepts_trait(returns_opaque_derived());
+ | ^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `::Associated`
+help: consider constraining the associated type `::Associated` to `()`
+ |
+LL | fn returns_opaque_derived() -> impl DerivedTrait + 'static {
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `::Associated == ()`
+ --> $DIR/issue-87261.rs:85:5
+ |
+LL | fn returns_opaque_foo() -> impl Trait + Foo {
+ | ---------------- the found opaque type
+...
+LL | fn accepts_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_trait`
+...
+LL | accepts_trait(returns_opaque_foo());
+ | ^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `::Associated`
+help: consider constraining the associated type `::Associated` to `()`
+ |
+LL | fn returns_opaque_foo() -> impl Trait + Foo {
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `::Associated == ()`
+ --> $DIR/issue-87261.rs:88:5
+ |
+LL | fn returns_opaque_derived_foo() -> impl DerivedTrait + Foo {
+ | ----------------------- the found opaque type
+...
+LL | fn accepts_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_trait`
+...
+LL | accepts_trait(returns_opaque_derived_foo());
+ | ^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `::Associated`
+ = help: consider constraining the associated type `::Associated` to `()`
+ = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
+
+error[E0271]: type mismatch resolving ` as GenericTrait<()>>::Associated == ()`
+ --> $DIR/issue-87261.rs:91:5
+ |
+LL | fn returns_opaque_generic() -> impl GenericTrait<()> + 'static {
+ | ------------------------------- the found opaque type
+...
+LL | fn accepts_generic_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_generic_trait`
+...
+LL | accepts_generic_trait(returns_opaque_generic());
+ | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type ` as GenericTrait<()>>::Associated`
+help: consider constraining the associated type ` as GenericTrait<()>>::Associated` to `()`
+ |
+LL | fn returns_opaque_generic() -> impl GenericTrait<(), Associated = ()> + 'static {
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `+Foo as GenericTrait<()>>::Associated == ()`
+ --> $DIR/issue-87261.rs:94:5
+ |
+LL | fn returns_opaque_generic_foo() -> impl GenericTrait<()> + Foo {
+ | --------------------------- the found opaque type
+...
+LL | fn accepts_generic_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_generic_trait`
+...
+LL | accepts_generic_trait(returns_opaque_generic_foo());
+ | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `+Foo as GenericTrait<()>>::Associated`
+help: consider constraining the associated type `+Foo as GenericTrait<()>>::Associated` to `()`
+ |
+LL | fn returns_opaque_generic_foo() -> impl GenericTrait<(), Associated = ()> + Foo {
+ | ^^^^^^^^^^^^^^^^^
+
+error[E0271]: type mismatch resolving `+GenericTrait as GenericTrait<()>>::Associated == ()`
+ --> $DIR/issue-87261.rs:97:5
+ |
+LL | fn returns_opaque_generic_duplicate() -> impl GenericTrait<()> + GenericTrait {
+ | ---------------------------------------- the found opaque type
+...
+LL | fn accepts_generic_trait>(_: T) {}
+ | --------------- required by this bound in `accepts_generic_trait`
+...
+LL | accepts_generic_trait(returns_opaque_generic_duplicate());
+ | ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
+ |
+ = note: expected unit type `()`
+ found associated type `+GenericTrait as GenericTrait<()>>::Associated`
+ = help: consider constraining the associated type `+GenericTrait as GenericTrait<()>>::Associated` to `()`
+ = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
+
+error: aborting due to 14 previous errors
+
+For more information about this error, try `rustc --explain E0271`.