summaryrefslogtreecommitdiffstats
path: root/src/test/ui/generic-associated-types/extended/lending_iterator.rs
blob: ede164766361e47a65f09ddbf05ec04d239fac14 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// revisions: base extended
//[base] check-fail
//[extended] check-pass

#![feature(generic_associated_types)]
#![cfg_attr(extended, feature(generic_associated_types_extended))]
#![cfg_attr(extended, allow(incomplete_features))]

pub trait FromLendingIterator<A>: Sized {
    fn from_iter<T: for<'x> LendingIterator<Item<'x> = A>>(iter: T) -> Self;
}

impl<A> FromLendingIterator<A> for Vec<A> {
    fn from_iter<I: for<'x> LendingIterator<Item<'x> = A>>(mut iter: I) -> Self {
        //[base]~^ impl has stricter
        let mut v = vec![];
        while let Some(item) = iter.next() {
            v.push(item);
        }
        v
    }
}

pub trait LendingIterator {
    type Item<'z>
    where
        Self: 'z;
    fn next(&mut self) -> Option<Self::Item<'_>>;

    fn collect<A, B: FromLendingIterator<A>>(self) -> B
    where
        Self: Sized,
        Self: for<'q> LendingIterator<Item<'q> = A>,
    {
        <B as FromLendingIterator<A>>::from_iter(self)
    }
}

fn main() {}