about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNick Cameron <ncameron@mozilla.com>2014-12-30 20:07:25 +1300
committerNick Cameron <ncameron@mozilla.com>2015-01-02 10:28:19 +1300
commit57a74eda8811bb04da2e081e3029aeec2f0bdcf4 (patch)
tree0298a926e462dddc7b82d96a9abd79be055c579c /src
parentd45b5d2ed9b43b3ad573482fb8820a382f20289e (diff)
downloadrust-57a74eda8811bb04da2e081e3029aeec2f0bdcf4.tar.gz
rust-57a74eda8811bb04da2e081e3029aeec2f0bdcf4.zip
Accept ranges with only a maximum value: `..expr`
Diffstat (limited to 'src')
-rw-r--r--src/libsyntax/parse/parser.rs15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index a58ed4811bf..cce21bbef26 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2146,14 +2146,14 @@ impl<'a> Parser<'a> {
             (&None, &Some(ref e)) => (e.span.lo, e.span.hi),
             (&None, &None) => (DUMMY_SP.lo, DUMMY_SP.hi),
         };
-        ExprIndex(expr, self.mk_expr(lo, hi, ExprRange(start, end)))
+        ExprIndex(expr, self.mk_expr(lo, hi, self.mk_range(start, end)))
     }
 
     pub fn mk_range(&mut self,
-                    start: P<Expr>,
+                    start: Option<P<Expr>>,
                     end: Option<P<Expr>>)
                     -> ast::Expr_ {
-        ExprRange(Some(start), end)
+        ExprRange(start, end)
     }
 
     pub fn mk_field(&mut self, expr: P<Expr>, ident: ast::SpannedIdent) -> ast::Expr_ {
@@ -2676,7 +2676,7 @@ impl<'a> Parser<'a> {
                 };
 
                 let hi = self.span.hi;
-                let range = self.mk_range(e, opt_end);
+                let range = self.mk_range(Some(e), opt_end);
                 return self.mk_expr(lo, hi, range);
               }
               _ => return e
@@ -2889,6 +2889,13 @@ impl<'a> Parser<'a> {
             hi = e.span.hi;
             ex = self.mk_unary(UnUniq, e);
           }
+          token::DotDot if !self.restrictions.contains(RESTRICTION_NO_DOTS) => {
+            // A range, closed above: `..expr`.
+            self.bump();
+            let e = self.parse_prefix_expr();
+            hi = e.span.hi;
+            ex = self.mk_range(None, Some(e));
+          }
           token::Ident(_, _) => {
             if !self.token.is_keyword(keywords::Box) {
                 return self.parse_dot_or_call_expr();