Allow negative literals in range pattern
diff --git a/src/expr.rs b/src/expr.rs
index e8eebdc..90037c2 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -228,7 +228,7 @@
     /// A literal
     Lit(Box<Expr>),
     /// A range pattern, e.g. `1...2`
-    Range(Box<Lit>, Box<Lit>),
+    Range(Box<Expr>, Box<Expr>),
     /// `[a, b, ..i, y, z]` is represented as:
     ///     `Pat::Slice(box [a, b], Some(i), box [y, z])`
     Slice(Vec<Pat>, Option<Box<Pat>>, Vec<Pat>),
@@ -1031,23 +1031,25 @@
         (Pat::Ref(Box::new(pat), mutability))
     ));
 
-    named!(pat_lit -> Pat, do_parse!(
+    named!(pat_lit -> Pat, map!(lit_maybe_neg, |lit| Pat::Lit(Box::new(lit))));
+
+    named!(pat_range -> Pat, do_parse!(
+        lo: lit_maybe_neg >>
+        punct!("...") >>
+        hi: lit_maybe_neg >>
+        (Pat::Range(Box::new(lo), Box::new(hi)))
+    ));
+
+    named!(lit_maybe_neg -> Expr, do_parse!(
         neg: option!(punct!("-")) >>
         v: lit >>
         (if neg.is_some() {
-            Pat::Lit(Box::new(Expr::Unary(UnOp::Neg, Box::new(Expr::Lit(v)))))
+            Expr::Unary(UnOp::Neg, Box::new(Expr::Lit(v)))
         } else {
-            Pat::Lit(Box::new(Expr::Lit(v)))
+            Expr::Lit(v)
         })
     ));
 
-    named!(pat_range -> Pat, do_parse!(
-        lo: lit >>
-        punct!("...") >>
-        hi: lit >>
-        (Pat::Range(Box::new(lo), Box::new(hi)))
-    ));
-
     named!(pat_slice -> Pat, do_parse!(
         punct!("[") >>
         mut before: separated_list!(punct!(","), pat) >>