summaryrefslogtreecommitdiffstats
path: root/src/test/ui/mir/mir-inlining/ice-issue-77564.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/mir/mir-inlining/ice-issue-77564.rs')
-rw-r--r--src/test/ui/mir/mir-inlining/ice-issue-77564.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/test/ui/mir/mir-inlining/ice-issue-77564.rs b/src/test/ui/mir/mir-inlining/ice-issue-77564.rs
new file mode 100644
index 000000000..0d3fbfe5d
--- /dev/null
+++ b/src/test/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]]
+ );
+}