about summary refs log tree commit diff
path: root/src/libsyntax/parse/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs40
1 files changed, 25 insertions, 15 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index adcaa006247..38cd09abad4 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2024,23 +2024,28 @@ pub impl Parser {
     fn parse_pat_vec_elements(
         &self,
         refutable: bool
-    ) -> (~[@pat], Option<@pat>) {
-        let mut elements = ~[];
-        let mut tail = None;
+    ) -> (~[@pat], Option<@pat>, ~[@pat]) {
+        let mut before = ~[];
+        let mut slice = None;
+        let mut after = ~[];
         let mut first = true;
+        let mut before_slice = true;
 
         while *self.token != token::RBRACKET {
             if first { first = false; }
             else { self.expect(&token::COMMA); }
 
-            let mut is_tail = false;
-            if *self.token == token::DOTDOT {
-                self.bump();
-                is_tail = true;
+            let mut is_slice = false;
+            if before_slice {
+                if *self.token == token::DOTDOT {
+                    self.bump();
+                    is_slice = true;
+                    before_slice = false;
+                }
             }
 
             let subpat = self.parse_pat(refutable);
-            if is_tail {
+            if is_slice {
                 match subpat {
                     @ast::pat { node: pat_wild, _ } => (),
                     @ast::pat { node: pat_ident(_, _, _), _ } => (),
@@ -2048,13 +2053,17 @@ pub impl Parser {
                         span, ~"expected an identifier or `_`"
                     )
                 }
-                tail = Some(subpat);
-                break;
+                slice = Some(subpat);
+            } else {
+                if before_slice {
+                    before.push(subpat);
+                } else {
+                    after.push(subpat);
+                }
             }
-
-            elements.push(subpat);
         }
-        return (elements, tail);
+
+        (before, slice, after)
     }
 
     fn parse_pat_fields(&self, refutable: bool) -> (~[ast::field_pat], bool) {
@@ -2208,10 +2217,11 @@ pub impl Parser {
           }
           token::LBRACKET => {
             self.bump();
-            let (elements, tail) = self.parse_pat_vec_elements(refutable);
+            let (before, slice, after) =
+                self.parse_pat_vec_elements(refutable);
             hi = self.span.hi;
             self.expect(&token::RBRACKET);
-            pat = ast::pat_vec(elements, tail);
+            pat = ast::pat_vec(before, slice, after);
           }
           copy tok => {
             if !is_ident_or_path(&tok)