@@ -3154,47 +3154,23 @@ impl<'a> Parser<'a> {
3154
3154
// Parse: `for <src_pat> in <src_expr> <src_loop_block>`
3155
3155
3156
3156
let pat = self . parse_pat ( ) ?;
3157
- // Save the state of the parser before parsing 'in'.
3158
- let parser_snapshot_before_in = self . clone ( ) ;
3159
- match self . expect_keyword ( keywords:: In ) {
3160
- Ok ( ( ) ) => {
3161
- let expr = self . parse_expr_res ( Restrictions :: NO_STRUCT_LITERAL , None ) ?;
3162
- let ( iattrs, loop_block) = self . parse_inner_attrs_and_block ( ) ?;
3163
- attrs. extend ( iattrs) ;
3164
-
3165
- let hi = self . prev_span ;
3166
- Ok ( self . mk_expr (
3167
- span_lo. to ( hi) ,
3168
- ExprKind :: ForLoop ( pat, expr, loop_block, opt_ident) ,
3169
- attrs) )
3170
- }
3171
- Err ( mut in_err) => {
3172
- let parser_snapshot_after_in = self . clone ( ) ;
3173
- // Rewind to before attempting to parse the 'in'.
3174
- mem:: replace ( self , parser_snapshot_before_in) ;
3175
-
3176
- match self . parse_expr_res ( Restrictions :: NO_STRUCT_LITERAL , None ) {
3177
- Ok ( _) => {
3178
- // Successfully parsed the expr which means that the 'in' keyword is
3179
- // missing, e.g. 'for i 0..2'
3180
- in_err. cancel ( ) ;
3181
- let in_span = parser_snapshot_after_in. prev_span
3182
- . between ( parser_snapshot_after_in. span ) ;
3183
- let mut err = self . sess . span_diagnostic
3184
- . struct_span_err ( in_span, "missing `in` in `for` loop" ) ;
3185
- err. span_label ( in_span, "expected `in` here" ) ;
3186
- err. span_suggestion_short ( in_span, "try adding `in` here" , " in " . into ( ) ) ;
3187
- Err ( err)
3188
- }
3189
- Err ( mut expr_err) => {
3190
- // Couldn't parse as an expr, return original error and parser state.
3191
- expr_err. cancel ( ) ;
3192
- mem:: replace ( self , parser_snapshot_after_in) ;
3193
- Err ( in_err)
3194
- }
3195
- }
3196
- }
3157
+ if !self . eat_keyword ( keywords:: In ) {
3158
+ let in_span = self . prev_span . between ( self . span ) ;
3159
+ let mut err = self . sess . span_diagnostic
3160
+ . struct_span_err ( in_span, "missing `in` in `for` loop" ) ;
3161
+ err. span_label ( in_span, "expected `in` here" ) ;
3162
+ err. span_suggestion_short ( in_span, "try adding `in` here" , " in " . into ( ) ) ;
3163
+ err. emit ( ) ;
3197
3164
}
3165
+ let expr = self . parse_expr_res ( Restrictions :: NO_STRUCT_LITERAL , None ) ?;
3166
+ let ( iattrs, loop_block) = self . parse_inner_attrs_and_block ( ) ?;
3167
+ attrs. extend ( iattrs) ;
3168
+
3169
+ let hi = self . prev_span ;
3170
+ Ok ( self . mk_expr (
3171
+ span_lo. to ( hi) ,
3172
+ ExprKind :: ForLoop ( pat, expr, loop_block, opt_ident) ,
3173
+ attrs) )
3198
3174
}
3199
3175
3200
3176
/// Parse a 'while' or 'while let' expression ('while' token already eaten)
0 commit comments