Capture of middle pattern inside slice pattern
diff --git a/src/expr.rs b/src/expr.rs
index 9e8adbd..e8eebdc 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -1050,18 +1050,27 @@
 
     named!(pat_slice -> Pat, do_parse!(
         punct!("[") >>
-        before: separated_list!(punct!(","), pat) >>
+        mut before: separated_list!(punct!(","), pat) >>
         after: option!(do_parse!(
-            cond!(!before.is_empty(), punct!(",")) >>
+            comma_before_dots: option!(cond_reduce!(!before.is_empty(), punct!(","))) >>
             punct!("..") >>
             after: many0!(preceded!(punct!(","), pat)) >>
             cond!(!after.is_empty(), option!(punct!(","))) >>
-            (after)
+            (comma_before_dots.is_some(), after)
         )) >>
         punct!("]") >>
         (match after {
-            Some(after) => Pat::Slice(before, Some(Box::new(Pat::Wild)), after),
             None => Pat::Slice(before, None, Vec::new()),
+            Some((true, after)) => {
+                if before.is_empty() {
+                    return IResult::Error;
+                }
+                Pat::Slice(before, Some(Box::new(Pat::Wild)), after)
+            }
+            Some((false, after)) => {
+                let rest = before.pop().unwrap_or(Pat::Wild);
+                Pat::Slice(before, Some(Box::new(rest)), after)
+            }
         })
     ));
 
@@ -1481,22 +1490,21 @@
                     tokens.append("...");
                     hi.to_tokens(tokens);
                 }
-                Pat::Slice(ref before, ref dots, ref after) => {
+                Pat::Slice(ref before, ref rest, ref after) => {
                     tokens.append("[");
                     tokens.append_separated(before, ",");
-                    match *dots {
-                        Some(ref dots) if **dots == Pat::Wild => {
-                            if !before.is_empty() {
-                                tokens.append(",");
-                            }
-                            tokens.append("..");
-                            if !after.is_empty() {
-                                tokens.append(",");
-                            }
-                            tokens.append_separated(after, ",");
+                    if let Some(ref rest) = *rest {
+                        if !before.is_empty() {
+                            tokens.append(",");
                         }
-                        None => {}
-                        _ => unimplemented!(),
+                        if **rest != Pat::Wild {
+                            rest.to_tokens(tokens);
+                        }
+                        tokens.append("..");
+                        if !after.is_empty() {
+                            tokens.append(",");
+                        }
+                        tokens.append_separated(after, ",");
                     }
                     tokens.append("]");
                 }