@@ -1771,7 +1771,7 @@ impl Parser {
17711771 } else if self . eat_keyword ( keywords:: If ) {
17721772 return self . parse_if_expr ( ) ;
17731773 } else if self . eat_keyword ( keywords:: For ) {
1774- return self . parse_for_expr ( ) ;
1774+ return self . parse_for_expr ( None ) ;
17751775 } else if self . eat_keyword ( keywords:: Do ) {
17761776 return self . parse_sugary_call_expr ( lo, ~"do", DoSugar ,
17771777 ExprDoBody ) ;
@@ -1781,8 +1781,13 @@ impl Parser {
17811781 let lifetime = self . get_lifetime ( & * self . token ) ;
17821782 self . bump ( ) ;
17831783 self . expect ( & token:: COLON ) ;
1784- self . expect_keyword ( keywords:: Loop ) ;
1785- return self . parse_loop_expr ( Some ( lifetime) ) ;
1784+ if self . eat_keyword ( keywords:: For ) {
1785+ return self . parse_for_expr ( Some ( lifetime) )
1786+ } else if self . eat_keyword ( keywords:: Loop ) {
1787+ return self . parse_loop_expr ( Some ( lifetime) )
1788+ } else {
1789+ self . fatal ( "expected `for` or `loop` after a label" )
1790+ }
17861791 } else if self . eat_keyword ( keywords:: Loop ) {
17871792 return self . parse_loop_expr ( None ) ;
17881793 } else if self . eat_keyword ( keywords:: Match ) {
@@ -2467,7 +2472,7 @@ impl Parser {
24672472 }
24682473
24692474 // parse a 'for' .. 'in' expression ('for' token already eaten)
2470- pub fn parse_for_expr ( & self ) -> @Expr {
2475+ pub fn parse_for_expr ( & self , opt_ident : Option < ast :: Ident > ) -> @Expr {
24712476 // Parse: `for <src_pat> in <src_expr> <src_loop_block>`
24722477
24732478 let lo = self . last_span . lo ;
@@ -2477,7 +2482,7 @@ impl Parser {
24772482 let loop_block = self . parse_block ( ) ;
24782483 let hi = self . span . hi ;
24792484
2480- self . mk_expr ( lo, hi, ExprForLoop ( pat, expr, loop_block) )
2485+ self . mk_expr ( lo, hi, ExprForLoop ( pat, expr, loop_block, opt_ident ) )
24812486 }
24822487
24832488
0 commit comments