Skip to content

Commit 16bf626

Browse files
committed
Auto merge of rust-lang#84130 - Aaron1011:fix/none-delim-lookahead, r=petrochenkov
Fix lookahead with None-delimited group Fixes rust-lang#84162, a regression introduced by rust-lang#82608.
2 parents 7537b20 + c6d67f8 commit 16bf626

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

compiler/rustc_parse/src/parser/mod.rs

+31-8
Original file line numberDiff line numberDiff line change
@@ -930,15 +930,38 @@ impl<'a> Parser<'a> {
930930
}
931931

932932
let frame = &self.token_cursor.frame;
933-
match frame.tree_cursor.look_ahead(dist - 1) {
934-
Some(tree) => match tree {
935-
TokenTree::Token(token) => looker(token),
936-
TokenTree::Delimited(dspan, delim, _) => {
937-
looker(&Token::new(token::OpenDelim(*delim), dspan.open))
938-
}
939-
},
940-
None => looker(&Token::new(token::CloseDelim(frame.delim), frame.span.close)),
933+
if frame.delim != DelimToken::NoDelim {
934+
let all_normal = (0..dist).all(|i| {
935+
let token = frame.tree_cursor.look_ahead(i);
936+
!matches!(token, Some(TokenTree::Delimited(_, DelimToken::NoDelim, _)))
937+
});
938+
if all_normal {
939+
return match frame.tree_cursor.look_ahead(dist - 1) {
940+
Some(tree) => match tree {
941+
TokenTree::Token(token) => looker(token),
942+
TokenTree::Delimited(dspan, delim, _) => {
943+
looker(&Token::new(token::OpenDelim(*delim), dspan.open))
944+
}
945+
},
946+
None => looker(&Token::new(token::CloseDelim(frame.delim), frame.span.close)),
947+
};
948+
}
949+
}
950+
951+
let mut cursor = self.token_cursor.clone();
952+
let mut i = 0;
953+
let mut token = Token::dummy();
954+
while i < dist {
955+
token = cursor.next().0;
956+
if matches!(
957+
token.kind,
958+
token::OpenDelim(token::NoDelim) | token::CloseDelim(token::NoDelim)
959+
) {
960+
continue;
961+
}
962+
i += 1;
941963
}
964+
return looker(&token);
942965
}
943966

944967
/// Returns whether any of the given keywords are `dist` tokens ahead of the current one.
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// check-pass
2+
3+
macro_rules! make_struct {
4+
($name:ident) => {
5+
#[derive(Debug)]
6+
struct Foo {
7+
#[cfg(not(FALSE))]
8+
field: fn($name: bool)
9+
}
10+
}
11+
}
12+
13+
make_struct!(param_name);
14+
15+
fn main() {}

0 commit comments

Comments
 (0)