2023-03-22 11:23:36 -05:00
|
|
|
// check-pass
|
2023-12-14 06:11:28 -06:00
|
|
|
// compile-flags: -Znext-solver
|
2023-03-22 11:23:36 -05:00
|
|
|
|
|
|
|
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() {}
|