Skip to content

Commit e3ee8db

Browse files
committed
Fix nested cfg_if if-statement not to hang
1 parent ea02de2 commit e3ee8db

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

Diff for: src/parse/macros/cfg_if.rs

+12-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::panic::{catch_unwind, AssertUnwindSafe};
33
use rustc_ast::ast;
44
use rustc_ast::token::{Delimiter, TokenKind};
55
use rustc_parse::parser::ForceCollect;
6+
use rustc_parse::parser::Parser;
67
use rustc_span::symbol::kw;
78

89
use crate::parse::macros::build_stream_parser;
@@ -12,21 +13,20 @@ pub(crate) fn parse_cfg_if<'a>(
1213
psess: &'a ParseSess,
1314
mac: &'a ast::MacCall,
1415
) -> Result<Vec<ast::Item>, &'static str> {
15-
match catch_unwind(AssertUnwindSafe(|| parse_cfg_if_inner(psess, mac))) {
16+
let ts = mac.args.tokens.clone();
17+
let mut parser = build_stream_parser(psess.inner(), ts);
18+
19+
match catch_unwind(AssertUnwindSafe(|| parse_cfg_if_inner(&mut parser, vec![]))) {
1620
Ok(Ok(items)) => Ok(items),
1721
Ok(err @ Err(_)) => err,
1822
Err(..) => Err("failed to parse cfg_if!"),
1923
}
2024
}
2125

2226
fn parse_cfg_if_inner<'a>(
23-
psess: &'a ParseSess,
24-
mac: &'a ast::MacCall,
27+
parser: &mut Parser<'a>,
28+
mut items: Vec<ast::Item>,
2529
) -> Result<Vec<ast::Item>, &'static str> {
26-
let ts = mac.args.tokens.clone();
27-
let mut parser = build_stream_parser(psess.inner(), ts);
28-
29-
let mut items = vec![];
3030
let mut process_if_cfg = true;
3131

3232
while parser.token.kind != TokenKind::Eof {
@@ -64,7 +64,11 @@ fn parse_cfg_if_inner<'a>(
6464
{
6565
let item = match parser.parse_item(ForceCollect::No) {
6666
Ok(Some(item_ptr)) => item_ptr.into_inner(),
67-
Ok(None) => continue,
67+
Ok(None) => {
68+
// maybe recursive if
69+
items = parse_cfg_if_inner(parser, items)?;
70+
continue;
71+
}
6872
Err(err) => {
6973
err.cancel();
7074
parser.psess.dcx().reset_err_count();

Diff for: tests/source/issue-4442.rs

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
cfg_if! {
2+
if #[cfg()] {
3+
if #[cfg()] {
4+
}
5+
}
6+
}

0 commit comments

Comments
 (0)