41 lines
771 B
Rust
41 lines
771 B
Rust
|
// check-pass
|
||
|
// compile-flags: -Ztrait-solver=next
|
||
|
|
||
|
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() {}
|