1 #![feature(generic_associated_types)]
2 // check-fail
3
4 enum Either<L, R> {
5 Left(L),
6 Right(R),
7 }
8
9 pub trait HasChildrenOf {
10 type T;
11 type TRef<'a>;
12 //~^ Missing required bounds
13
ref_children<'a>(&'a self) -> Vec<Self::TRef<'a>>14 fn ref_children<'a>(&'a self) -> Vec<Self::TRef<'a>>;
take_children(self) -> Vec<Self::T>15 fn take_children(self) -> Vec<Self::T>;
16 }
17
18 impl<Left, Right> HasChildrenOf for Either<Left, Right>
19 where
20 Left: HasChildrenOf,
21 Right: HasChildrenOf,
22 {
23 type T = Either<Left::T, Right::T>;
24 // We used to error below because the where clause doesn't match the trait.
25 // Now, we error early on the trait itself.
26 type TRef<'a>
27 where
28 <Left as HasChildrenOf>::T: 'a,
29 <Right as HasChildrenOf>::T: 'a
30 = Either<&'a Left::T, &'a Right::T>;
31
ref_children<'a>(&'a self) -> Vec<Self::TRef<'a>>32 fn ref_children<'a>(&'a self) -> Vec<Self::TRef<'a>> {
33 todo!()
34 }
35
take_children(self) -> Vec<Self::T>36 fn take_children(self) -> Vec<Self::T> {
37 todo!()
38 }
39 }
40
main()41 fn main() {}
42