diff options
| author | Ulrik Sverdrup <root@localhost> | 2015-02-04 23:23:12 +0100 |
|---|---|---|
| committer | Ulrik Sverdrup <root@localhost> | 2015-02-04 23:23:12 +0100 |
| commit | 75239142a8271895775d69ef50037b0162cdcd6e (patch) | |
| tree | b41d240b3a91749bda5f1846e36c6b36dd397acb | |
| parent | 3b2ed14906fd9f9daa27cc7d1dad263d2f5ff450 (diff) | |
| download | rust-75239142a8271895775d69ef50037b0162cdcd6e.tar.gz rust-75239142a8271895775d69ef50037b0162cdcd6e.zip | |
Implement `..` syntax for RangeFull as expression
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.
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 33 | ||||
| -rw-r--r-- | src/test/compile-fail/slice-1.rs | 9 | ||||
| -rw-r--r-- | src/test/compile-fail/slice-2.rs | 2 | ||||
| -rw-r--r-- | src/test/run-pass/range.rs | 1 | ||||
| -rw-r--r-- | src/test/run-pass/ranges-precedence.rs | 3 | ||||
| -rw-r--r-- | src/test/run-pass/slice-2.rs | 3 |
6 files changed, 28 insertions, 23 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index c3182602a4b..d8d03349019 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2524,16 +2524,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. @@ -2557,7 +2548,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; @@ -2566,11 +2561,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 } @@ -2931,9 +2921,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) } _ => { diff --git a/src/test/compile-fail/slice-1.rs b/src/test/compile-fail/slice-1.rs index 903760caf1a..23ad5b09950 100644 --- a/src/test/compile-fail/slice-1.rs +++ b/src/test/compile-fail/slice-1.rs @@ -8,12 +8,15 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// Test slicing expr[..] is an error and gives a helpful error message. +// Test slicing &expr[] is deprecated and gives a helpful error message. +// +// ignore-test struct Foo; fn main() { let x = Foo; - &x[..]; //~ ERROR incorrect slicing expression: `[..]` - //~^ NOTE use `&expr[]` to construct a slice of the whole of expr + &x[]; //~ WARNING deprecated slicing syntax: `[]` + //~^ NOTE use `&expr[..]` to construct a slice of the whole of expr + //~^^ ERROR cannot index a value of type `Foo` } diff --git a/src/test/compile-fail/slice-2.rs b/src/test/compile-fail/slice-2.rs index 07162293565..99dc3e68c8f 100644 --- a/src/test/compile-fail/slice-2.rs +++ b/src/test/compile-fail/slice-2.rs @@ -14,7 +14,7 @@ struct Foo; fn main() { let x = Foo; - &x[]; //~ ERROR cannot index a value of type `Foo` + &x[..]; //~ ERROR cannot index a value of type `Foo` &x[Foo..]; //~ ERROR cannot index a value of type `Foo` &x[..Foo]; //~ ERROR cannot index a value of type `Foo` &x[Foo..Foo]; //~ ERROR cannot index a value of type `Foo` diff --git a/src/test/run-pass/range.rs b/src/test/run-pass/range.rs index 11e8bfa48f6..5d2337e3819 100644 --- a/src/test/run-pass/range.rs +++ b/src/test/run-pass/range.rs @@ -14,6 +14,7 @@ fn foo() -> int { 42 } // Test that range syntax works in return statements fn return_range_to() -> ::std::ops::RangeTo<i32> { return ..1; } +fn return_full_range() -> ::std::ops::RangeFull { return ..; } pub fn main() { let mut count = 0; diff --git a/src/test/run-pass/ranges-precedence.rs b/src/test/run-pass/ranges-precedence.rs index c947220f1f8..cd490948516 100644 --- a/src/test/run-pass/ranges-precedence.rs +++ b/src/test/run-pass/ranges-precedence.rs @@ -55,5 +55,8 @@ fn main() { let x = [1]..[2]; assert!(x == (([1])..([2]))); + + let y = ..; + assert!(y == (..)); } diff --git a/src/test/run-pass/slice-2.rs b/src/test/run-pass/slice-2.rs index 43e517404cb..3f6afc8d987 100644 --- a/src/test/run-pass/slice-2.rs +++ b/src/test/run-pass/slice-2.rs @@ -14,6 +14,7 @@ fn main() { let x: &[int] = &[1, 2, 3, 4, 5]; let cmp: &[int] = &[1, 2, 3, 4, 5]; assert!(&x[] == cmp); + assert!(&x[..] == cmp); let cmp: &[int] = &[3, 4, 5]; assert!(&x[2..] == cmp); let cmp: &[int] = &[1, 2, 3]; @@ -35,6 +36,7 @@ fn main() { { let cmp: &mut [int] = &mut [1, 2, 3, 4, 5]; assert!(&mut x[] == cmp); + assert!(&mut x[..] == cmp); } { let cmp: &mut [int] = &mut [3, 4, 5]; @@ -53,6 +55,7 @@ fn main() { { let cmp: &mut [int] = &mut [1, 2, 3, 4, 5]; assert!(&mut x[] == cmp); + assert!(&mut x[..] == cmp); } { let cmp: &mut [int] = &mut [3, 4, 5]; |
