From 57a74eda8811bb04da2e081e3029aeec2f0bdcf4 Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Tue, 30 Dec 2014 20:07:25 +1300 Subject: [PATCH] Accept ranges with only a maximum value: `..expr` --- src/libsyntax/parse/parser.rs | 15 +++++++++++---- 1 file 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, + start: Option>, end: Option>) -> ast::Expr_ { - ExprRange(Some(start), end) + ExprRange(start, end) } pub fn mk_field(&mut self, expr: P, 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();