|  | // 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()); | 
|  | } |