| //@ edition:2018 |
| |
| // See issue 60414 |
| |
| // Reduction to `impl Trait` |
| |
| struct Foo<T>(T); |
| |
| trait FooLike { |
| type Output; |
| } |
| |
| impl<T> FooLike for Foo<T> { |
| type Output = T; |
| } |
| |
| mod impl_trait { |
| use super::*; |
| |
| trait Trait { |
| type Assoc; |
| } |
| |
| /// `T::Assoc` can't be normalized any further here. |
| fn foo_fail<T: Trait>() -> impl FooLike<Output = T::Assoc> { |
| //~^ ERROR: type mismatch |
| Foo(()) |
| } |
| } |
| |
| // Same with lifetimes in the trait |
| |
| mod lifetimes { |
| use super::*; |
| |
| trait Trait<'a> { |
| type Assoc; |
| } |
| |
| /// Missing bound constraining `Assoc`, `T::Assoc` can't be normalized further. |
| fn foo2_fail<'a, T: Trait<'a>>() -> impl FooLike<Output = T::Assoc> { |
| //~^ ERROR: type mismatch |
| Foo(()) |
| } |
| } |
| |
| fn main() {} |