]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generic-associated-types/iterable.rs
Auto merge of #99612 - yanchen4791:issue-95079-fix, r=compiler-errors
[rust.git] / src / test / ui / generic-associated-types / iterable.rs
1 #![feature(generic_associated_types)]
2
3 // run-pass
4
5 trait Iterable {
6     type Item<'a> where Self: 'a;
7     type Iter<'a>: Iterator<Item = Self::Item<'a>> where Self: 'a;
8
9     fn iter<'a>(&'a self) -> Self::Iter<'a>;
10 }
11
12 // Impl for struct type
13 impl<T> Iterable for Vec<T> {
14     type Item<'a> = <std::slice::Iter<'a, T> as Iterator>::Item where T: 'a;
15     type Iter<'a> = std::slice::Iter<'a, T> where T: 'a;
16
17     fn iter<'a>(&'a self) -> Self::Iter<'a> {
18         self[..].iter()
19     }
20 }
21
22 // Impl for a primitive type
23 impl<T> Iterable for [T] {
24     type Item<'a> = <std::slice::Iter<'a, T> as Iterator>::Item where T: 'a;
25     type Iter<'a> = std::slice::Iter<'a, T> where T: 'a;
26
27     fn iter<'a>(&'a self) -> Self::Iter<'a> {
28         self.iter()
29     }
30 }
31
32 fn make_iter<'a, I: Iterable + ?Sized>(it: &'a I) -> I::Iter<'a> {
33     it.iter()
34 }
35
36 fn get_first<'a, I: Iterable + ?Sized>(it: &'a I) -> Option<I::Item<'a>> {
37     it.iter().next()
38 }
39
40 fn main() {
41     let v = vec![1, 2, 3];
42     assert_eq!(v, make_iter(&v).copied().collect::<Vec<_>>());
43     assert_eq!(v, make_iter(&*v).copied().collect::<Vec<_>>());
44     assert_eq!(Some(&1), get_first(&v));
45     assert_eq!(Some(&1), get_first(&*v));
46 }