This commit is contained in:
Nick Cameron
2015-01-04 17:43:24 +13:00
parent 791f545685
commit 0c7f7a5fb8
89 changed files with 543 additions and 468 deletions

View File

@@ -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