@@ -261,6 +261,7 @@ pub struct Parser<'a> {
261
261
/// the previous token or None (only stashed sometimes).
262
262
pub last_token : Option < Box < token:: Token > > ,
263
263
last_token_interpolated : bool ,
264
+ last_token_eof : bool ,
264
265
pub buffer : [ TokenAndSpan ; 4 ] ,
265
266
pub buffer_start : isize ,
266
267
pub buffer_end : isize ,
@@ -369,6 +370,7 @@ impl<'a> Parser<'a> {
369
370
last_span : span,
370
371
last_token : None ,
371
372
last_token_interpolated : false ,
373
+ last_token_eof : false ,
372
374
buffer : [
373
375
placeholder. clone ( ) ,
374
376
placeholder. clone ( ) ,
@@ -939,7 +941,9 @@ impl<'a> Parser<'a> {
939
941
{
940
942
try!( self . expect ( bra) ) ;
941
943
let result = self . parse_seq_to_before_end ( ket, sep, f) ;
942
- self . bump ( ) ;
944
+ if self . token == * ket {
945
+ self . bump ( ) ;
946
+ }
943
947
Ok ( result)
944
948
}
945
949
@@ -982,6 +986,15 @@ impl<'a> Parser<'a> {
982
986
983
987
/// Advance the parser by one token
984
988
pub fn bump ( & mut self ) {
989
+ if self . last_token_eof {
990
+ // Bumping after EOF is a bad sign, usually an infinite loop.
991
+ self . bug ( "attempted to bump the parser past EOF (may be stuck in a loop)" ) ;
992
+ }
993
+
994
+ if self . token == token:: Eof {
995
+ self . last_token_eof = true ;
996
+ }
997
+
985
998
self . last_span = self . span ;
986
999
// Stash token for error recovery (sometimes; clone is not necessarily cheap).
987
1000
self . last_token = if self . token . is_ident ( ) ||
@@ -1265,15 +1278,21 @@ impl<'a> Parser<'a> {
1265
1278
Ok ( cua) => cua,
1266
1279
Err ( e) => {
1267
1280
loop {
1268
- p. bump ( ) ;
1269
- if p. token == token:: Semi {
1270
- p. bump ( ) ;
1271
- break ;
1272
- }
1281
+ match p. token {
1282
+ token:: Eof => break ,
1273
1283
1274
- if p. token == token:: OpenDelim ( token:: DelimToken :: Brace ) {
1275
- try!( p. parse_token_tree ( ) ) ;
1276
- break ;
1284
+ token:: CloseDelim ( token:: Brace ) |
1285
+ token:: Semi => {
1286
+ p. bump ( ) ;
1287
+ break ;
1288
+ }
1289
+
1290
+ token:: OpenDelim ( token:: Brace ) => {
1291
+ try!( p. parse_token_tree ( ) ) ;
1292
+ break ;
1293
+ }
1294
+
1295
+ _ => p. bump ( )
1277
1296
}
1278
1297
}
1279
1298
@@ -3790,7 +3809,9 @@ impl<'a> Parser<'a> {
3790
3809
fn recover_stmt_ ( & mut self , break_on_semi : SemiColonMode ) {
3791
3810
let mut brace_depth = 0 ;
3792
3811
let mut bracket_depth = 0 ;
3812
+ debug ! ( "recover_stmt_ enter loop" ) ;
3793
3813
loop {
3814
+ debug ! ( "recover_stmt_ loop {:?}" , self . token) ;
3794
3815
match self . token {
3795
3816
token:: OpenDelim ( token:: DelimToken :: Brace ) => {
3796
3817
brace_depth += 1 ;
@@ -3802,6 +3823,7 @@ impl<'a> Parser<'a> {
3802
3823
}
3803
3824
token:: CloseDelim ( token:: DelimToken :: Brace ) => {
3804
3825
if brace_depth == 0 {
3826
+ debug ! ( "recover_stmt_ return - close delim {:?}" , self . token) ;
3805
3827
return ;
3806
3828
}
3807
3829
brace_depth -= 1 ;
@@ -3814,12 +3836,16 @@ impl<'a> Parser<'a> {
3814
3836
}
3815
3837
self . bump ( ) ;
3816
3838
}
3817
- token:: Eof => return ,
3839
+ token:: Eof => {
3840
+ debug ! ( "recover_stmt_ return - Eof" ) ;
3841
+ return ;
3842
+ }
3818
3843
token:: Semi => {
3819
3844
self . bump ( ) ;
3820
3845
if break_on_semi == SemiColonMode :: Break &&
3821
3846
brace_depth == 0 &&
3822
3847
bracket_depth == 0 {
3848
+ debug ! ( "recover_stmt_ return - Semi" ) ;
3823
3849
return ;
3824
3850
}
3825
3851
}
@@ -4008,6 +4034,8 @@ impl<'a> Parser<'a> {
4008
4034
while !self . eat ( & token:: CloseDelim ( token:: Brace ) ) {
4009
4035
let Spanned { node, span} = if let Some ( s) = self . parse_stmt_ ( ) {
4010
4036
s
4037
+ } else if self . token == token:: Eof {
4038
+ break ;
4011
4039
} else {
4012
4040
// Found only `;` or `}`.
4013
4041
continue ;
0 commit comments