Skip to content

Commit 5d73918

Browse files
committed
Clone entire TokenCursor when collecting tokens
Reverts PR #80830 Fixes taiki-e/pin-project#312 We can have an arbitrary number of `None`-delimited group frames pushed on the stack due to proc-macro invocations, which can legally be exited. Attempting to account for this would add a lot of complexity for a tiny performance gain, so let's just use the original strategy.
1 parent 0e19020 commit 5d73918

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

compiler/rustc_parse/src/parser/mod.rs

+1-9
Original file line numberDiff line numberDiff line change
@@ -1254,15 +1254,7 @@ impl<'a> Parser<'a> {
12541254
f: impl FnOnce(&mut Self) -> PResult<'a, (R, TrailingToken)>,
12551255
) -> PResult<'a, R> {
12561256
let start_token = (self.token.clone(), self.token_spacing);
1257-
let cursor_snapshot = TokenCursor {
1258-
frame: self.token_cursor.frame.clone(),
1259-
// We only ever capture tokens within our current frame,
1260-
// so we can just use an empty frame stack
1261-
stack: vec![],
1262-
desugar_doc_comments: self.token_cursor.desugar_doc_comments,
1263-
num_next_calls: self.token_cursor.num_next_calls,
1264-
append_unglued_token: self.token_cursor.append_unglued_token.clone(),
1265-
};
1257+
let cursor_snapshot = self.token_cursor.clone();
12661258

12671259
let (mut ret, trailing_token) = f(self)?;
12681260

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// force-host
2+
// no-prefer-dynamic
3+
4+
#![crate_type = "proc-macro"]
5+
#![feature(proc_macro_quote)]
6+
7+
extern crate proc_macro;
8+
use proc_macro::{TokenStream, quote};
9+
10+
#[proc_macro_attribute]
11+
pub fn first_attr(_: TokenStream, input: TokenStream) -> TokenStream {
12+
let recollected: TokenStream = input.into_iter().collect();
13+
quote! {
14+
#[second_attr]
15+
$recollected
16+
}
17+
}
18+
19+
#[proc_macro_attribute]
20+
pub fn second_attr(_: TokenStream, input: TokenStream) -> TokenStream {
21+
let _recollected: TokenStream = input.into_iter().collect();
22+
TokenStream::new()
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// check-pass
2+
// aux-build:nonterminal-recollect-attr.rs
3+
4+
extern crate nonterminal_recollect_attr;
5+
use nonterminal_recollect_attr::*;
6+
7+
macro_rules! my_macro {
8+
($v:ident) => {
9+
#[first_attr]
10+
$v struct Foo {
11+
field: u8
12+
}
13+
}
14+
}
15+
16+
my_macro!(pub);
17+
fn main() {}

0 commit comments

Comments
 (0)