Skip to content

Commit 9a32f6a

Browse files
nrcpnkfelix
authored andcommitted
Don't loop forever on error recovery with EOF
closes rust-lang#31804
1 parent 625bba3 commit 9a32f6a

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

src/libsyntax/parse/parser.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -3809,7 +3809,9 @@ impl<'a> Parser<'a> {
38093809
fn recover_stmt_(&mut self, break_on_semi: SemiColonMode) {
38103810
let mut brace_depth = 0;
38113811
let mut bracket_depth = 0;
3812+
debug!("recover_stmt_ enter loop");
38123813
loop {
3814+
debug!("recover_stmt_ loop {:?}", self.token);
38133815
match self.token {
38143816
token::OpenDelim(token::DelimToken::Brace) => {
38153817
brace_depth += 1;
@@ -3821,6 +3823,7 @@ impl<'a> Parser<'a> {
38213823
}
38223824
token::CloseDelim(token::DelimToken::Brace) => {
38233825
if brace_depth == 0 {
3826+
debug!("recover_stmt_ return - close delim {:?}", self.token);
38243827
return;
38253828
}
38263829
brace_depth -= 1;
@@ -3833,12 +3836,16 @@ impl<'a> Parser<'a> {
38333836
}
38343837
self.bump();
38353838
}
3836-
token::Eof => return,
3839+
token::Eof => {
3840+
debug!("recover_stmt_ return - Eof");
3841+
return;
3842+
}
38373843
token::Semi => {
38383844
self.bump();
38393845
if break_on_semi == SemiColonMode::Break &&
38403846
brace_depth == 0 &&
38413847
bracket_depth == 0 {
3848+
debug!("recover_stmt_ return - Semi");
38423849
return;
38433850
}
38443851
}
@@ -4027,6 +4034,8 @@ impl<'a> Parser<'a> {
40274034
while !self.eat(&token::CloseDelim(token::Brace)) {
40284035
let Spanned {node, span} = if let Some(s) = self.parse_stmt_() {
40294036
s
4037+
} else if self.token == token::Eof {
4038+
break;
40304039
} else {
40314040
// Found only `;` or `}`.
40324041
continue;

0 commit comments

Comments
 (0)