| // Here we test that rest patterns, i.e. `..`, are not allowed | 
 | // outside of slice (+ ident patterns within those), tuple, | 
 | // and tuple struct patterns and that duplicates are caught in these contexts. | 
 |  | 
 | #![feature(box_patterns)] | 
 |  | 
 | fn main() {} | 
 |  | 
 | macro_rules! mk_pat { | 
 |     () => { .. } //~ ERROR `..` patterns are not allowed here | 
 | } | 
 |  | 
 | fn rest_patterns() { | 
 |     let mk_pat!(); | 
 |  | 
 |     // Top level: | 
 |     fn foo(..: u8) {} //~ ERROR `..` patterns are not allowed here | 
 |     let ..;  //~ ERROR `..` patterns are not allowed here | 
 |  | 
 |     // Box patterns: | 
 |     let box ..;  //~ ERROR `..` patterns are not allowed here | 
 |  | 
 |     // In or-patterns: | 
 |     match 1 { | 
 |         1 | .. => {} //~ ERROR `..` patterns are not allowed here | 
 |     } | 
 |  | 
 |     // Ref patterns: | 
 |     let &..; //~ ERROR `..` patterns are not allowed here | 
 |     let &mut ..; //~ ERROR `..` patterns are not allowed here | 
 |  | 
 |     // Ident patterns: | 
 |     let x @ ..; //~ ERROR `..` patterns are not allowed here | 
 |     //~^ ERROR type annotations needed | 
 |     let ref x @ ..; //~ ERROR `..` patterns are not allowed here | 
 |     let ref mut x @ ..; //~ ERROR `..` patterns are not allowed here | 
 |  | 
 |     // Tuple: | 
 |     let (..): (u8,); // OK. | 
 |     let (..,): (u8,); // OK. | 
 |     let ( | 
 |         .., | 
 |         .., //~ ERROR `..` can only be used once per tuple pattern | 
 |         .. //~ ERROR `..` can only be used once per tuple pattern | 
 |     ): (u8, u8, u8); | 
 |     let ( | 
 |         .., | 
 |         x, | 
 |         .. //~ ERROR `..` can only be used once per tuple pattern | 
 |     ): (u8, u8, u8); | 
 |  | 
 |     struct A(u8, u8, u8); | 
 |  | 
 |     // Tuple struct (same idea as for tuple patterns): | 
 |     let A(..); // OK. | 
 |     let A(..,); // OK. | 
 |     let A( | 
 |         .., | 
 |         .., //~ ERROR `..` can only be used once per tuple struct pattern | 
 |         .. //~ ERROR `..` can only be used once per tuple struct pattern | 
 |     ); | 
 |     let A( | 
 |         .., | 
 |         x, | 
 |         .. //~ ERROR `..` can only be used once per tuple struct pattern | 
 |     ); | 
 |  | 
 |     // Array/Slice: | 
 |     let [..]: &[u8]; // OK. | 
 |     let [..,]: &[u8]; // OK. | 
 |     let [ | 
 |         .., | 
 |         .., //~ ERROR `..` can only be used once per slice pattern | 
 |         .. //~ ERROR `..` can only be used once per slice pattern | 
 |     ]: &[u8]; | 
 |     let [ | 
 |         .., | 
 |         ref x @ .., //~ ERROR `..` can only be used once per slice pattern | 
 |         ref mut y @ .., //~ ERROR `..` can only be used once per slice pattern | 
 |         (ref z @ ..), //~ ERROR `..` patterns are not allowed here | 
 |         .. //~ ERROR `..` can only be used once per slice pattern | 
 |     ]: &[u8]; | 
 | } |