Skip to content

Commit 175cfbf

Browse files
committed
Remove the parser snapshot hack.
1 parent 0d72853 commit 175cfbf

File tree

1 file changed

+16
-40
lines changed

1 file changed

+16
-40
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3154,47 +3154,23 @@ impl<'a> Parser<'a> {
31543154
// Parse: `for <src_pat> in <src_expr> <src_loop_block>`
31553155

31563156
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();
31973164
}
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))
31983174
}
31993175

32003176
/// Parse a 'while' or 'while let' expression ('while' token already eaten)

0 commit comments

Comments
 (0)