diff options
| author | Nick Cameron <ncameron@mozilla.com> | 2015-01-04 17:43:24 +1300 |
|---|---|---|
| committer | Nick Cameron <ncameron@mozilla.com> | 2015-01-07 12:02:52 +1300 |
| commit | 0c7f7a5fb8919c6a382f9acd1e921c51f807f625 (patch) | |
| tree | 74a8f54870574e503df68fd62d799552c8664cf8 /src/libsyntax/parse/parser.rs | |
| parent | 791f5456859845a4a1814eca45aa900fc62d4e44 (diff) | |
| download | rust-0c7f7a5fb8919c6a382f9acd1e921c51f807f625.tar.gz rust-0c7f7a5fb8919c6a382f9acd1e921c51f807f625.zip | |
fallout
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 7824dacd3a1..0ecd098951f 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1726,7 +1726,7 @@ impl<'a> Parser<'a> { token::Str_(s) => { (true, - LitStr(token::intern_and_get_ident(parse::str_lit(s.as_str()).index(&FullRange)), + LitStr(token::intern_and_get_ident(parse::str_lit(s.as_str()).as_slice()), ast::CookedStr)) } token::StrRaw(s, n) => { @@ -2538,16 +2538,26 @@ impl<'a> Parser<'a> { token::OpenDelim(token::Bracket) => { let bracket_pos = self.span.lo; self.bump(); - if self.eat(&token::CloseDelim(token::Bracket)) { + + 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)) { // No expression, expand to a FullRange - let ix = { - hi = self.last_span.hi; - let range = ExprStruct(ident_to_path(mk_sp(lo, hi), - token::special_idents::FullRange), - vec![], - None); - self.mk_expr(bracket_pos, hi, range) - }; + // FIXME(#20516) It would be better to use a lang item or + // something for FullRange. + hi = self.last_span.hi; + let range = ExprStruct(ident_to_path(mk_sp(lo, hi), + token::special_idents::FullRange), + 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) } else { @@ -2557,6 +2567,12 @@ impl<'a> Parser<'a> { let index = self.mk_index(e, ix); 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"); + } } // A range expression, either `expr..expr` or `expr..`. @@ -4881,7 +4897,7 @@ impl<'a> Parser<'a> { let token_str = self.this_token_to_string(); self.fatal(format!("expected `where`, or `{}` after struct \ name, found `{}`", "{", - token_str)[]); + token_str).index(&FullRange)); } fields |
