]> git.proxmox.com Git - rustc.git/blob - src/test/ui/mir/mir-inlining/ice-issue-77564.rs
New upstream version 1.66.0+dfsg1
[rustc.git] / src / test / ui / mir / mir-inlining / ice-issue-77564.rs
1 // run-pass
2 // compile-flags:-Zmir-opt-level=3
3
4 use std::mem::MaybeUninit;
5 const N: usize = 2;
6
7 trait CollectArray<A>: Iterator<Item = A> {
8 fn inner_array(&mut self) -> [A; N];
9 fn collect_array(&mut self) -> [A; N] {
10 let result = self.inner_array();
11 assert!(self.next().is_none());
12 result
13 }
14 }
15
16 impl<A, I: ?Sized> CollectArray<A> for I
17 where
18 I: Iterator<Item = A>,
19 {
20 fn inner_array(&mut self) -> [A; N] {
21 let mut result: [MaybeUninit<A>; N] = unsafe { MaybeUninit::uninit().assume_init() };
22 for (dest, item) in result.iter_mut().zip(self) {
23 *dest = MaybeUninit::new(item);
24 }
25 let temp_ptr: *const [MaybeUninit<A>; N] = &result;
26 unsafe { std::ptr::read(temp_ptr as *const [A; N]) }
27 }
28 }
29
30 fn main() {
31 assert_eq!(
32 [[1, 2], [3, 4]]
33 .iter()
34 .map(|row| row.iter().collect_array())
35 .collect_array(),
36 [[&1, &2], [&3, &4]]
37 );
38 }