about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBastian Kauschke <bastian_kauschke@hotmail.de>2020-07-16 12:23:38 +0200
committerBastian Kauschke <bastian_kauschke@hotmail.de>2020-07-16 12:23:38 +0200
commitde8d2e897f8397d1005a3a35c2eb5a710d5f1e32 (patch)
treec92475777929279c4b2164797a4cb36f9358d69f
parenta2b18274a890eb19db5f784b2fb6925eebcdf86f (diff)
downloadrust-de8d2e897f8397d1005a3a35c2eb5a710d5f1e32.tar.gz
rust-de8d2e897f8397d1005a3a35c2eb5a710d5f1e32.zip
add regression test for #71805
-rw-r--r--src/test/ui/const-generics/type-dependent/issue-71805.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/test/ui/const-generics/type-dependent/issue-71805.rs b/src/test/ui/const-generics/type-dependent/issue-71805.rs
new file mode 100644
index 00000000000..6823d780aef
--- /dev/null
+++ b/src/test/ui/const-generics/type-dependent/issue-71805.rs
@@ -0,0 +1,41 @@
+// run-pass
+#![feature(const_generics)]
+#![allow(incomplete_features)]
+
+use std::mem::MaybeUninit;
+
+trait CollectSlice<'a>: Iterator {
+    fn inner_array<const N: usize>(&mut self) -> [Self::Item; N];
+
+    fn collect_array<const N: usize>(&mut self) -> [Self::Item; N] {
+        let result = self.inner_array();
+        assert!(self.next().is_none());
+        result
+    }
+}
+
+impl<'a, I: ?Sized> CollectSlice<'a> for I
+where
+    I: Iterator,
+{
+    fn inner_array<const N: usize>(&mut self) -> [Self::Item; N] {
+        let mut result: [MaybeUninit<Self::Item>; N] =
+            unsafe { MaybeUninit::uninit().assume_init() };
+
+        let mut count = 0;
+        for (dest, item) in result.iter_mut().zip(self) {
+            *dest = MaybeUninit::new(item);
+            count += 1;
+        }
+
+        assert_eq!(N, count);
+
+        let temp_ptr: *const [MaybeUninit<Self::Item>; N] = &result;
+        unsafe { std::ptr::read(temp_ptr as *const [Self::Item; N]) }
+    }
+}
+
+fn main() {
+    let mut foos = [0u64; 9].iter().cloned();
+    let _bar: [u64; 9] = foos.collect_array::<9_usize>();
+}