Skip to content

Commit

Permalink
Implement .. syntax for RangeFull as expression
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Ulrik Sverdrup committed Feb 4, 2015
1 parent 3b2ed14 commit 7523914
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 23 deletions.
33 changes: 14 additions & 19 deletions src/libsyntax/parse/parser.rs
Expand Up @@ -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.
Expand All @@ -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;
Expand All @@ -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
}
Expand Down Expand Up @@ -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)
}
_ => {
Expand Down
9 changes: 6 additions & 3 deletions src/test/compile-fail/slice-1.rs
Expand Up @@ -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`
}
2 changes: 1 addition & 1 deletion src/test/compile-fail/slice-2.rs
Expand Up @@ -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`
Expand Down
1 change: 1 addition & 0 deletions src/test/run-pass/range.rs
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions src/test/run-pass/ranges-precedence.rs
Expand Up @@ -55,5 +55,8 @@ fn main() {

let x = [1]..[2];
assert!(x == (([1])..([2])));

let y = ..;
assert!(y == (..));
}

3 changes: 3 additions & 0 deletions src/test/run-pass/slice-2.rs
Expand Up @@ -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];
Expand All @@ -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];
Expand All @@ -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];
Expand Down

0 comments on commit 7523914

Please sign in to comment.