about summary refs log tree commit diff
path: root/src/libsyntax/parse/parser.rs
diff options
context:
space:
mode:
authorNick Cameron <ncameron@mozilla.com>2015-01-04 17:43:24 +1300
committerNick Cameron <ncameron@mozilla.com>2015-01-07 12:02:52 +1300
commit0c7f7a5fb8919c6a382f9acd1e921c51f807f625 (patch)
tree74a8f54870574e503df68fd62d799552c8664cf8 /src/libsyntax/parse/parser.rs
parent791f5456859845a4a1814eca45aa900fc62d4e44 (diff)
downloadrust-0c7f7a5fb8919c6a382f9acd1e921c51f807f625.tar.gz
rust-0c7f7a5fb8919c6a382f9acd1e921c51f807f625.zip
fallout
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs38
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