diff options
| author | bors <bors@rust-lang.org> | 2015-02-06 03:11:34 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-02-06 03:11:34 +0000 |
| commit | 715f9a5e8da73e04bff039dddc58800a5e6a24bd (patch) | |
| tree | aed48bae92209ee30d468c7d75f84ce0cafa6fce /src/libsyntax/parse | |
| parent | 706be5ba1f65ede0ffe095df8fa79706cbb562c8 (diff) | |
| parent | 7d527fa96b92bca102fdc77d3b07f804c384138b (diff) | |
| download | rust-715f9a5e8da73e04bff039dddc58800a5e6a24bd.tar.gz rust-715f9a5e8da73e04bff039dddc58800a5e6a24bd.zip | |
Auto merge of #21947 - bluss:full-range-syntax, r=brson
Implement step 1 of rust-lang/rfcs#702 Allows the expression `..` (without either endpoint) in general, can be used in slicing syntax `&expr[..]` where we previously wrote `&expr[]`. The old syntax &expr[] is not yet removed or warned for.
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 22174494458..cae23c5a2cc 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2527,16 +2527,7 @@ impl<'a> Parser<'a> { let bracket_pos = self.span.lo; self.bump(); - let mut found_dotdot = false; - if self.token == token::DotDot && - self.look_ahead(1, |t| t == &token::CloseDelim(token::Bracket)) { - // Using expr[..], which is a mistake, should be expr[] - self.bump(); - self.bump(); - found_dotdot = true; - } - - if found_dotdot || self.eat(&token::CloseDelim(token::Bracket)) { + if self.eat(&token::CloseDelim(token::Bracket)) { // No expression, expand to a RangeFull // FIXME(#20516) It would be better to use a lang item or // something for RangeFull. @@ -2560,7 +2551,11 @@ impl<'a> Parser<'a> { let range = ExprStruct(path, vec![], None); let ix = self.mk_expr(bracket_pos, hi, range); let index = self.mk_index(e, ix); - e = self.mk_expr(lo, hi, index) + e = self.mk_expr(lo, hi, index); + // Enable after snapshot. + // self.span_warn(e.span, "deprecated slicing syntax: `[]`"); + // self.span_note(e.span, + // "use `&expr[..]` to construct a slice of the whole of expr"); } else { let ix = self.parse_expr(); hi = self.span.hi; @@ -2569,11 +2564,6 @@ impl<'a> Parser<'a> { e = self.mk_expr(lo, hi, index) } - if found_dotdot { - self.span_err(e.span, "incorrect slicing expression: `[..]`"); - self.span_note(e.span, - "use `&expr[]` to construct a slice of the whole of expr"); - } } _ => return e } @@ -2934,9 +2924,14 @@ impl<'a> Parser<'a> { // with the postfix-form 'expr..' let lo = self.span.lo; self.bump(); - let rhs = self.parse_binops(); - let hi = rhs.span.hi; - let ex = self.mk_range(None, Some(rhs)); + let opt_end = if self.is_at_start_of_range_notation_rhs() { + let end = self.parse_binops(); + Some(end) + } else { + None + }; + let hi = self.span.hi; + let ex = self.mk_range(None, opt_end); self.mk_expr(lo, hi, ex) } _ => { |
