// Check that closure captures for slice patterns are inferred correctly #![allow(unused_variables)] #![allow(dropping_references)] //@ run-pass fn arr_by_ref(x: [String; 3]) { let r = &x; let f = || { let [ref y, ref z @ ..] = x; }; f(); f(); // Ensure `x` was borrowed drop(r); // Ensure that `x` wasn't moved from. drop(x); } fn arr_by_mut(mut x: [String; 3]) { let mut f = || { let [ref mut y, ref mut z @ ..] = x; }; f(); f(); drop(x); } fn arr_by_move(x: [String; 3]) { let f = || { let [y, z @ ..] = x; }; f(); } fn arr_ref_by_ref(x: &[String; 3]) { let r = &x; let f = || { let [ref y, ref z @ ..] = *x; }; let g = || { let [y, z @ ..] = x; }; f(); g(); f(); g(); drop(r); drop(x); } fn arr_ref_by_mut(x: &mut [String; 3]) { let mut f = || { let [ref mut y, ref mut z @ ..] = *x; }; f(); f(); let mut g = || { let [y, z @ ..] = x; // Ensure binding mode was chosen correctly: std::mem::swap(y, &mut z[0]); }; g(); g(); drop(x); } fn arr_box_by_move(x: Box<[String; 3]>) { let f = || { let [y, z @ ..] = *x; }; f(); } fn slice_by_ref(x: &[String]) { let r = &x; let f = || { if let [ref y, ref z @ ..] = *x {} }; let g = || { if let [y, z @ ..] = x {} }; f(); g(); f(); g(); drop(r); drop(x); } fn slice_by_mut(x: &mut [String]) { let mut f = || { if let [ref mut y, ref mut z @ ..] = *x {} }; f(); f(); let mut g = || { if let [y, z @ ..] = x { // Ensure binding mode was chosen correctly: std::mem::swap(y, &mut z[0]); } }; g(); g(); drop(x); } fn main() { arr_by_ref(Default::default()); arr_by_mut(Default::default()); arr_by_move(Default::default()); arr_ref_by_ref(&Default::default()); arr_ref_by_mut(&mut Default::default()); arr_box_by_move(Default::default()); slice_by_ref(&<[_; 3]>::default()); slice_by_mut(&mut <[_; 3]>::default()); }