|  | //@ 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() {} |