diff options
| author | kennytm <kennytm@gmail.com> | 2018-05-23 00:26:18 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-05-23 00:26:18 +0800 |
| commit | aa63dce256d447211d3285941a4323621feabbe4 (patch) | |
| tree | 6a6c8c7e1fd8ef09f9f22cb0167b66186720364c /src/libsyntax/parse | |
| parent | 98e801ac0be56d20dfdecb235cf912c58f9a9531 (diff) | |
| parent | 3b8f791bf60c0e77ec713356e841c836eb6a55fb (diff) | |
| download | rust-aa63dce256d447211d3285941a4323621feabbe4.tar.gz rust-aa63dce256d447211d3285941a4323621feabbe4.zip | |
Rollup merge of #50946 - alexcrichton:fix-parse-lifetime, r=petrochenkov
rustc: Fix procedural macros generating lifetime tokens This commit fixes an accidental regression from #50473 where lifetime tokens produced by procedural macros ended up getting lost in translation in the compiler and not actually producing parseable code. The issue lies in the fact that a lifetime's `Ident` is prefixed with `'`. The `glue` implementation for gluing joint tokens together forgot to take this into account so the lifetime inside of `Ident` was missing the leading tick! The `glue` implementation here is updated to create a new `Symbol` in these situations to manufacture a new `Ident` with a leading tick to ensure it parses correctly. Closes #50942
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/token.rs | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 034be6a6864..ed28d5f33b9 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -22,6 +22,7 @@ use serialize::{Decodable, Decoder, Encodable, Encoder}; use symbol::keywords; use syntax::parse::parse_stream_from_source_str; use syntax_pos::{self, Span, FileName}; +use syntax_pos::symbol::{self, Symbol}; use tokenstream::{TokenStream, TokenTree}; use tokenstream; @@ -478,7 +479,13 @@ impl Token { _ => return None, }, SingleQuote => match joint { - Ident(ident, false) => Lifetime(ident), + Ident(ident, false) => { + let name = Symbol::intern(&format!("'{}", ident)); + Lifetime(symbol::Ident { + name, + span: ident.span, + }) + } _ => return None, }, |
