diff options
| author | bors <bors@rust-lang.org> | 2019-03-13 03:30:20 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-03-13 03:30:20 +0000 |
| commit | aa97448caf49ee25271a5ad58482283404b9144f (patch) | |
| tree | a7eefc25327ab135d272d3464e8ed88ac09def91 /src/libsyntax/parse | |
| parent | f8860f217dda287600b2b2f1812d3026aa0d35d4 (diff) | |
| parent | 73feddb9d4509498e9aeb4075a1f1c24b6bad962 (diff) | |
| download | rust-aa97448caf49ee25271a5ad58482283404b9144f.tar.gz rust-aa97448caf49ee25271a5ad58482283404b9144f.zip | |
Auto merge of #59151 - Centril:rollup, r=Centril
Rollup of 16 pull requests
Successful merges:
- #58829 (librustc_interface: Update scoped-tls to 1.0)
- #58876 (Parse lifetimes that start with a number and give specific error)
- #58908 (Update rand version)
- #58998 (Fix documentation of from_ne_bytes and from_le_bytes)
- #59056 (Use lifetime contravariance to elide more lifetimes in core+alloc+std)
- #59057 (Standardize `Range*` documentation)
- #59080 (Fix incorrect links in librustc_codegen_llvm documentation)
- #59083 (Fix #54822 and associated faulty tests)
- #59093 (Remove precompute_in_scope_traits_hashes)
- #59101 (Reduces Code Repetitions like `!n >> amt`)
- #59121 (impl FromIterator for Result: Use assert_eq! instead of assert!)
- #59124 (Replace assert with assert_eq)
- #59129 (Visit impl Trait for dead_code lint)
- #59130 (Note that NonNull does not launder shared references for mutation)
- #59132 (ignore higher-ranked object bound conditions created by WF)
- #59138 (Simplify Iterator::{min, max})
Failed merges:
r? @ghost
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/lexer/mod.rs | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index db5b8dcda4e..01e3b292903 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -1423,15 +1423,17 @@ impl<'a> StringReader<'a> { // If the character is an ident start not followed by another single // quote, then this is a lifetime name: - if ident_start(Some(c2)) && !self.ch_is('\'') { + if (ident_start(Some(c2)) || c2.is_numeric()) && !self.ch_is('\'') { while ident_continue(self.ch) { self.bump(); } // lifetimes shouldn't end with a single quote // if we find one, then this is an invalid character literal if self.ch_is('\'') { - self.err_span_(start_with_quote, self.next_pos, - "character literal may only contain one codepoint"); + self.err_span_( + start_with_quote, + self.next_pos, + "character literal may only contain one codepoint"); self.bump(); return Ok(token::Literal(token::Err(Symbol::intern("??")), None)) @@ -1444,6 +1446,15 @@ impl<'a> StringReader<'a> { self.mk_ident(&format!("'{}", lifetime_name)) }); + if c2.is_numeric() { + // this is a recovered lifetime written `'1`, error but accept it + self.err_span_( + start_with_quote, + self.pos, + "lifetimes cannot start with a number", + ); + } + return Ok(token::Lifetime(ident)); } @@ -1873,6 +1884,7 @@ fn is_block_doc_comment(s: &str) -> bool { res } +/// Determine whether `c` is a valid start for an ident. fn ident_start(c: Option<char>) -> bool { let c = match c { Some(c) => c, |
