| #![feature(type_alias_impl_trait)] |
| |
| pub trait Foo {} |
| |
| pub trait Bar { |
| type Foo: Foo; |
| |
| fn foo() -> Self::Foo; |
| } |
| |
| pub trait Baz { |
| type Foo: Foo; |
| type Bar: Bar<Foo = Self::Foo>; |
| |
| fn foo() -> Self::Foo; |
| fn bar() -> Self::Bar; |
| } |
| |
| impl Foo for () {} |
| |
| impl Bar for () { |
| type Foo = FooImpl; |
| |
| #[define_opaque(FooImpl)] |
| fn foo() -> Self::Foo { |
| () |
| } |
| } |
| |
| pub type FooImpl = impl Foo; |
| pub type BarImpl = impl Bar<Foo = FooImpl>; |
| |
| impl Baz for () { |
| type Foo = FooImpl; |
| type Bar = BarImpl; |
| |
| #[define_opaque(FooImpl)] |
| fn foo() -> Self::Foo { |
| () |
| } |
| |
| #[define_opaque(BarImpl)] |
| fn bar() -> Self::Bar { |
| //~^ ERROR: item does not constrain `FooImpl::{opaque#0}` |
| () |
| } |
| } |
| |
| fn main() {} |