about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/lexer/mod.rs25
1 files changed, 15 insertions, 10 deletions
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 {