@@ -2099,28 +2099,32 @@ impl<'a> Parser<'a> {
2099
2099
return self . parse_if_expr ( ) ;
2100
2100
}
2101
2101
if try!( self . eat_keyword ( keywords:: For ) ) {
2102
- return self . parse_for_expr ( None ) ;
2102
+ let lo = self . last_span . lo ;
2103
+ return self . parse_for_expr ( None , lo) ;
2103
2104
}
2104
2105
if try!( self . eat_keyword ( keywords:: While ) ) {
2105
- return self . parse_while_expr ( None ) ;
2106
+ let lo = self . last_span . lo ;
2107
+ return self . parse_while_expr ( None , lo) ;
2106
2108
}
2107
2109
if self . token . is_lifetime ( ) {
2108
2110
let lifetime = self . get_lifetime ( ) ;
2111
+ let lo = self . span . lo ;
2109
2112
try!( self . bump ( ) ) ;
2110
2113
try!( self . expect ( & token:: Colon ) ) ;
2111
2114
if try!( self . eat_keyword ( keywords:: While ) ) {
2112
- return self . parse_while_expr ( Some ( lifetime) )
2115
+ return self . parse_while_expr ( Some ( lifetime) , lo )
2113
2116
}
2114
2117
if try!( self . eat_keyword ( keywords:: For ) ) {
2115
- return self . parse_for_expr ( Some ( lifetime) )
2118
+ return self . parse_for_expr ( Some ( lifetime) , lo )
2116
2119
}
2117
2120
if try!( self . eat_keyword ( keywords:: Loop ) ) {
2118
- return self . parse_loop_expr ( Some ( lifetime) )
2121
+ return self . parse_loop_expr ( Some ( lifetime) , lo )
2119
2122
}
2120
2123
return Err ( self . fatal ( "expected `while`, `for`, or `loop` after a label" ) )
2121
2124
}
2122
2125
if try!( self . eat_keyword ( keywords:: Loop ) ) {
2123
- return self . parse_loop_expr ( None ) ;
2126
+ let lo = self . last_span . lo ;
2127
+ return self . parse_loop_expr ( None , lo) ;
2124
2128
}
2125
2129
if try!( self . eat_keyword ( keywords:: Continue ) ) {
2126
2130
let lo = self . span . lo ;
@@ -2892,48 +2896,48 @@ impl<'a> Parser<'a> {
2892
2896
}
2893
2897
2894
2898
/// Parse a 'for' .. 'in' expression ('for' token already eaten)
2895
- pub fn parse_for_expr ( & mut self , opt_ident : Option < ast:: Ident > ) -> PResult < P < Expr > > {
2899
+ pub fn parse_for_expr ( & mut self , opt_ident : Option < ast:: Ident > ,
2900
+ span_lo : BytePos ) -> PResult < P < Expr > > {
2896
2901
// Parse: `for <src_pat> in <src_expr> <src_loop_block>`
2897
2902
2898
- let lo = self . last_span . lo ;
2899
2903
let pat = try!( self . parse_pat_nopanic ( ) ) ;
2900
2904
try!( self . expect_keyword ( keywords:: In ) ) ;
2901
2905
let expr = try!( self . parse_expr_res ( Restrictions :: RESTRICTION_NO_STRUCT_LITERAL ) ) ;
2902
2906
let loop_block = try!( self . parse_block ( ) ) ;
2903
2907
let hi = self . last_span . hi ;
2904
2908
2905
- Ok ( self . mk_expr ( lo , hi, ExprForLoop ( pat, expr, loop_block, opt_ident) ) )
2909
+ Ok ( self . mk_expr ( span_lo , hi, ExprForLoop ( pat, expr, loop_block, opt_ident) ) )
2906
2910
}
2907
2911
2908
2912
/// Parse a 'while' or 'while let' expression ('while' token already eaten)
2909
- pub fn parse_while_expr ( & mut self , opt_ident : Option < ast:: Ident > ) -> PResult < P < Expr > > {
2913
+ pub fn parse_while_expr ( & mut self , opt_ident : Option < ast:: Ident > ,
2914
+ span_lo : BytePos ) -> PResult < P < Expr > > {
2910
2915
if self . token . is_keyword ( keywords:: Let ) {
2911
- return self . parse_while_let_expr ( opt_ident) ;
2916
+ return self . parse_while_let_expr ( opt_ident, span_lo ) ;
2912
2917
}
2913
- let lo = self . last_span . lo ;
2914
2918
let cond = try!( self . parse_expr_res ( Restrictions :: RESTRICTION_NO_STRUCT_LITERAL ) ) ;
2915
2919
let body = try!( self . parse_block ( ) ) ;
2916
2920
let hi = body. span . hi ;
2917
- return Ok ( self . mk_expr ( lo , hi, ExprWhile ( cond, body, opt_ident) ) ) ;
2921
+ return Ok ( self . mk_expr ( span_lo , hi, ExprWhile ( cond, body, opt_ident) ) ) ;
2918
2922
}
2919
2923
2920
2924
/// Parse a 'while let' expression ('while' token already eaten)
2921
- pub fn parse_while_let_expr ( & mut self , opt_ident : Option < ast:: Ident > ) -> PResult < P < Expr > > {
2922
- let lo = self . last_span . lo ;
2925
+ pub fn parse_while_let_expr ( & mut self , opt_ident : Option < ast:: Ident > ,
2926
+ span_lo : BytePos ) -> PResult < P < Expr > > {
2923
2927
try!( self . expect_keyword ( keywords:: Let ) ) ;
2924
2928
let pat = try!( self . parse_pat_nopanic ( ) ) ;
2925
2929
try!( self . expect ( & token:: Eq ) ) ;
2926
2930
let expr = try!( self . parse_expr_res ( Restrictions :: RESTRICTION_NO_STRUCT_LITERAL ) ) ;
2927
2931
let body = try!( self . parse_block ( ) ) ;
2928
2932
let hi = body. span . hi ;
2929
- return Ok ( self . mk_expr ( lo , hi, ExprWhileLet ( pat, expr, body, opt_ident) ) ) ;
2933
+ return Ok ( self . mk_expr ( span_lo , hi, ExprWhileLet ( pat, expr, body, opt_ident) ) ) ;
2930
2934
}
2931
2935
2932
- pub fn parse_loop_expr ( & mut self , opt_ident : Option < ast:: Ident > ) -> PResult < P < Expr > > {
2933
- let lo = self . last_span . lo ;
2936
+ pub fn parse_loop_expr ( & mut self , opt_ident : Option < ast:: Ident > ,
2937
+ span_lo : BytePos ) -> PResult < P < Expr > > {
2934
2938
let body = try!( self . parse_block ( ) ) ;
2935
2939
let hi = body. span . hi ;
2936
- Ok ( self . mk_expr ( lo , hi, ExprLoop ( body, opt_ident) ) )
2940
+ Ok ( self . mk_expr ( span_lo , hi, ExprLoop ( body, opt_ident) ) )
2937
2941
}
2938
2942
2939
2943
fn parse_match_expr ( & mut self ) -> PResult < P < Expr > > {
0 commit comments