// Test that we infer the expected type of a pattern to an array of the given length. #![allow(unused_variables)] use std::array::TryFromSliceError; use std::convert::TryInto; struct Zeroes; impl Into<[usize; 2]> for Zeroes { fn into(self) -> [usize; 2] { [0; 2] } } impl Into<[usize; 3]> for Zeroes { fn into(self) -> [usize; 3] { [0; 3] } } impl Into<[usize; 4]> for Zeroes { fn into(self) -> [usize; 4] { [0; 4] } } fn zeroes_into() { let [a, b, c] = Zeroes.into(); let [d, e, f]: [_; 3] = Zeroes.into(); } fn array_try_from(x: &[usize]) -> Result { let [a, b] = x.try_into()?; Ok(a + b) } fn destructuring_assignment() { let a: i32; let b; [a, b] = Default::default(); } fn test_nested_array() { let a: [_; 3]; let b; //~^ ERROR type annotations needed [a, b] = Default::default(); } fn test_nested_array_type_hint() { let a: [_; 3]; let b; [a, b] = Default::default(); let _: i32 = b[1]; } fn test_working_nested_array() { let a: i32; [[a, _, _], _, _] = Default::default(); } struct Foo([T; 2]); impl Default for Foo { fn default() -> Self { Foo([Default::default(); 2]) } } fn field_array() { let a: i32; let b; Foo([a, b]) = Default::default(); } fn main() {}