|  | //@ check-pass | 
|  | //@ compile-flags: -Znext-solver | 
|  |  | 
|  | trait Foo { | 
|  | type Gat<'a> | 
|  | where | 
|  | Self: 'a; | 
|  | fn bar(&self) -> Self::Gat<'_>; | 
|  | } | 
|  |  | 
|  | enum Option<T> { | 
|  | Some(T), | 
|  | None, | 
|  | } | 
|  |  | 
|  | impl<T> Option<T> { | 
|  | fn as_ref(&self) -> Option<&T> { | 
|  | match self { | 
|  | Option::Some(t) => Option::Some(t), | 
|  | Option::None => Option::None, | 
|  | } | 
|  | } | 
|  |  | 
|  | fn map<U>(self, f: impl FnOnce(T) -> U) -> Option<U> { | 
|  | match self { | 
|  | Option::Some(t) => Option::Some(f(t)), | 
|  | Option::None => Option::None, | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | impl<T: Foo + 'static> Foo for Option<T> { | 
|  | type Gat<'a> = Option<<T as Foo>::Gat<'a>> where Self: 'a; | 
|  |  | 
|  | fn bar(&self) -> Self::Gat<'_> { | 
|  | self.as_ref().map(Foo::bar) | 
|  | } | 
|  | } | 
|  |  | 
|  | fn main() {} |