// Check that closure captures for slice patterns are inferred correctly fn arr_by_ref(mut x: [String; 3]) { let f = || { let [ref y, ref z @ ..] = x; }; let r = &mut x; //~^ ERROR cannot borrow f(); } fn arr_by_mut(mut x: [String; 3]) { let mut f = || { let [ref mut y, ref mut z @ ..] = x; }; let r = &x; //~^ ERROR cannot borrow f(); } fn arr_by_move(x: [String; 3]) { let f = || { let [y, z @ ..] = x; }; &x; //~^ ERROR borrow of moved value } fn arr_ref_by_ref(x: &mut [String; 3]) { let f = || { let [ref y, ref z @ ..] = *x; }; let r = &mut *x; //~^ ERROR cannot borrow f(); } fn arr_ref_by_uniq(x: &mut [String; 3]) { let mut f = || { let [ref mut y, ref mut z @ ..] = *x; }; let r = &x; //~^ ERROR cannot borrow f(); } fn arr_box_by_move(x: Box<[String; 3]>) { let f = || { let [y, z @ ..] = *x; }; &x; //~^ ERROR borrow of moved value } fn slice_by_ref(x: &mut [String]) { let f = || { if let [ref y, ref z @ ..] = *x {} }; let r = &mut *x; //~^ ERROR cannot borrow f(); } fn slice_by_uniq(x: &mut [String]) { let mut f = || { if let [ref mut y, ref mut z @ ..] = *x {} }; let r = &x; //~^ ERROR cannot borrow f(); } fn main() { arr_by_ref(Default::default()); arr_by_mut(Default::default()); arr_by_move(Default::default()); arr_ref_by_ref(&mut Default::default()); arr_ref_by_uniq(&mut Default::default()); arr_box_by_move(Default::default()); slice_by_ref(&mut <[_; 3]>::default()); slice_by_uniq(&mut <[_; 3]>::default()); }