From acc9428c6a99d199f35032ec7f794385e4c9fd24 Mon Sep 17 00:00:00 2001 From: Greg Chapple Date: Thu, 7 Jan 2016 16:12:28 +0000 Subject: Display better snippet for invalid char literal Given this code: fn main() { let _ = 'abcd'; } The compiler would give a message like: error: character literal may only contain one codepoint: '; let _ = 'abcd'; ^~ With this change, the message now displays: error: character literal may only contain one codepoint: 'abcd' let _ = 'abcd' ^~~~~~ Fixes #30033 --- src/libsyntax/parse/lexer/mod.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index 1402b7888dd..3183dfbd954 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -1195,6 +1195,7 @@ impl<'a> StringReader<'a> { } '\'' => { // Either a character constant 'a' OR a lifetime name 'abc + let start_with_quote = self.last_pos; self.bump(); let start = self.last_pos; @@ -1208,6 +1209,14 @@ impl<'a> StringReader<'a> { while ident_continue(self.curr) { self.bump(); } + // lifetimes shouldn't end with a single quote + // if we find one, then this is an invalid character literal + if self.curr_is('\'') { + panic!(self.fatal_span_verbose( + start_with_quote, self.pos, + String::from("character literal may only contain one codepoint"))); + + } // Include the leading `'` in the real identifier, for macro // expansion purposes. See #12512 for the gory details of why @@ -1233,26 +1242,22 @@ impl<'a> StringReader<'a> { !keyword_checking_token.is_keyword(token::keywords::Static) { self.err_span_(start, last_bpos, "invalid lifetime name"); } + return token::Lifetime(ident); } - // Otherwise it is a character constant: let valid = self.scan_char_or_byte(start, c2, // ascii_only = false, '\''); + if !self.curr_is('\'') { - let last_bpos = self.last_pos; - panic!(self.fatal_span_verbose(// Byte offsetting here is okay because the - // character before position `start` is an - // ascii single quote. - start - BytePos(1), - last_bpos, - - String::from("character literal may only \ - contain one codepoint"))); + panic!(self.fatal_span_verbose( + start_with_quote, self.last_pos, + String::from("character literal may only contain one codepoint"))); } + let id = if valid { self.name_from(start) } else { -- cgit 1.4.1-3-g733a5