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