]> git.proxmox.com Git - rustc.git/blob - tests/ui/const-generics/type-dependent/issue-71805.rs
New upstream version 1.68.2+dfsg1
[rustc.git] / tests / ui / const-generics / type-dependent / issue-71805.rs
1 // run-pass
2 use std::mem::MaybeUninit;
3
4 trait CollectSlice<'a>: Iterator {
5 fn inner_array<const N: usize>(&mut self) -> [Self::Item; N];
6
7 fn collect_array<const N: usize>(&mut self) -> [Self::Item; N] {
8 let result = self.inner_array();
9 assert!(self.next().is_none());
10 result
11 }
12 }
13
14 impl<'a, I: ?Sized> CollectSlice<'a> for I
15 where
16 I: Iterator,
17 {
18 fn inner_array<const N: usize>(&mut self) -> [Self::Item; N] {
19 let mut result: [MaybeUninit<Self::Item>; N] =
20 unsafe { MaybeUninit::uninit().assume_init() };
21
22 let mut count = 0;
23 for (dest, item) in result.iter_mut().zip(self) {
24 *dest = MaybeUninit::new(item);
25 count += 1;
26 }
27
28 assert_eq!(N, count);
29
30 let temp_ptr: *const [MaybeUninit<Self::Item>; N] = &result;
31 unsafe { std::ptr::read(temp_ptr as *const [Self::Item; N]) }
32 }
33 }
34
35 fn main() {
36 let mut foos = [0u64; 9].iter().cloned();
37 let _bar: [u64; 9] = foos.collect_array::<9_usize>();
38 }