diff options
Diffstat (limited to 'tests/ui/mir/mir-inlining/ice-issue-77564.rs')
-rw-r--r-- | tests/ui/mir/mir-inlining/ice-issue-77564.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/ui/mir/mir-inlining/ice-issue-77564.rs b/tests/ui/mir/mir-inlining/ice-issue-77564.rs new file mode 100644 index 000000000..0d3fbfe5d --- /dev/null +++ b/tests/ui/mir/mir-inlining/ice-issue-77564.rs @@ -0,0 +1,38 @@ +// run-pass +// compile-flags:-Zmir-opt-level=3 + +use std::mem::MaybeUninit; +const N: usize = 2; + +trait CollectArray<A>: Iterator<Item = A> { + fn inner_array(&mut self) -> [A; N]; + fn collect_array(&mut self) -> [A; N] { + let result = self.inner_array(); + assert!(self.next().is_none()); + result + } +} + +impl<A, I: ?Sized> CollectArray<A> for I +where + I: Iterator<Item = A>, +{ + fn inner_array(&mut self) -> [A; N] { + let mut result: [MaybeUninit<A>; N] = unsafe { MaybeUninit::uninit().assume_init() }; + for (dest, item) in result.iter_mut().zip(self) { + *dest = MaybeUninit::new(item); + } + let temp_ptr: *const [MaybeUninit<A>; N] = &result; + unsafe { std::ptr::read(temp_ptr as *const [A; N]) } + } +} + +fn main() { + assert_eq!( + [[1, 2], [3, 4]] + .iter() + .map(|row| row.iter().collect_array()) + .collect_array(), + [[&1, &2], [&3, &4]] + ); +} |