diff options
| author | Bastian Kauschke <bastian_kauschke@hotmail.de> | 2020-07-16 12:23:38 +0200 |
|---|---|---|
| committer | Bastian Kauschke <bastian_kauschke@hotmail.de> | 2020-07-16 12:23:38 +0200 |
| commit | de8d2e897f8397d1005a3a35c2eb5a710d5f1e32 (patch) | |
| tree | c92475777929279c4b2164797a4cb36f9358d69f | |
| parent | a2b18274a890eb19db5f784b2fb6925eebcdf86f (diff) | |
| download | rust-de8d2e897f8397d1005a3a35c2eb5a710d5f1e32.tar.gz rust-de8d2e897f8397d1005a3a35c2eb5a710d5f1e32.zip | |
add regression test for #71805
| -rw-r--r-- | src/test/ui/const-generics/type-dependent/issue-71805.rs | 41 |
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>(); +} |
