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
This commit is contained in:
commit
aa63dce256
3 changed files with 65 additions and 1 deletions
|
@ -22,6 +22,7 @@ use serialize::{Decodable, Decoder, Encodable, Encoder};
|
||||||
use symbol::keywords;
|
use symbol::keywords;
|
||||||
use syntax::parse::parse_stream_from_source_str;
|
use syntax::parse::parse_stream_from_source_str;
|
||||||
use syntax_pos::{self, Span, FileName};
|
use syntax_pos::{self, Span, FileName};
|
||||||
|
use syntax_pos::symbol::{self, Symbol};
|
||||||
use tokenstream::{TokenStream, TokenTree};
|
use tokenstream::{TokenStream, TokenTree};
|
||||||
use tokenstream;
|
use tokenstream;
|
||||||
|
|
||||||
|
@ -478,7 +479,13 @@ impl Token {
|
||||||
_ => return None,
|
_ => return None,
|
||||||
},
|
},
|
||||||
SingleQuote => match joint {
|
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,
|
_ => return None,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// no-prefer-dynamic
|
||||||
|
|
||||||
|
#![crate_type = "proc-macro"]
|
||||||
|
#![feature(proc_macro)]
|
||||||
|
|
||||||
|
extern crate proc_macro;
|
||||||
|
|
||||||
|
use proc_macro::*;
|
||||||
|
|
||||||
|
#[proc_macro]
|
||||||
|
pub fn bar(_input: TokenStream) -> TokenStream {
|
||||||
|
let mut ret = Vec::<TokenTree>::new();
|
||||||
|
ret.push(Ident::new("static", Span::call_site()).into());
|
||||||
|
ret.push(Ident::new("FOO", Span::call_site()).into());
|
||||||
|
ret.push(Punct::new(':', Spacing::Alone).into());
|
||||||
|
ret.push(Punct::new('&', Spacing::Alone).into());
|
||||||
|
ret.push(Punct::new('\'', Spacing::Joint).into());
|
||||||
|
ret.push(Ident::new("static", Span::call_site()).into());
|
||||||
|
ret.push(Ident::new("i32", Span::call_site()).into());
|
||||||
|
ret.push(Punct::new('=', Spacing::Alone).into());
|
||||||
|
ret.push(Punct::new('&', Spacing::Alone).into());
|
||||||
|
ret.push(Literal::i32_unsuffixed(1).into());
|
||||||
|
ret.push(Punct::new(';', Spacing::Alone).into());
|
||||||
|
ret.into_iter().collect()
|
||||||
|
}
|
22
src/test/run-pass-fulldeps/proc-macro/gen-lifetime-token.rs
Normal file
22
src/test/run-pass-fulldeps/proc-macro/gen-lifetime-token.rs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// aux-build:gen-lifetime-token.rs
|
||||||
|
|
||||||
|
#![feature(proc_macro)]
|
||||||
|
|
||||||
|
extern crate gen_lifetime_token as bar;
|
||||||
|
|
||||||
|
bar::bar!();
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x: &'static i32 = FOO;
|
||||||
|
assert_eq!(*x, 1);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue