diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index ef006d5fcda8c..a907f50a11bbf 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -1,9 +1,10 @@ +use super::diagnostics::SnapshotParser; use super::pat::{CommaRecoveryMode, RecoverColon, RecoverComma, PARAM_EXPECTED}; use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign}; use super::{ - AttrWrapper, BlockMode, ClosureSpans, ForceCollect, Parser, PathStyle, Restrictions, TokenType, + AttrWrapper, BlockMode, ClosureSpans, ForceCollect, Parser, PathStyle, Restrictions, + SemiColonMode, SeqSep, TokenExpectType, TokenType, TrailingToken, }; -use super::{SemiColonMode, SeqSep, TokenExpectType, TrailingToken}; use crate::maybe_recover_from_interpolated_ty_qpath; use ast::token::DelimToken; @@ -1105,7 +1106,7 @@ impl<'a> Parser<'a> { let snapshot = if self.token.kind == token::OpenDelim(token::Paren) && self.look_ahead_type_ascription_as_field() { - Some((self.clone(), fun.kind.clone())) + Some((self.create_snapshot_for_diagnostic(), fun.kind.clone())) } else { None }; @@ -1130,7 +1131,7 @@ impl<'a> Parser<'a> { lo: Span, open_paren: Span, seq: &mut PResult<'a, P>, - snapshot: Option<(Self, ExprKind)>, + snapshot: Option<(SnapshotParser<'a>, ExprKind)>, ) -> Option> { match (seq.as_mut(), snapshot) { (Err(err), Some((mut snapshot, ExprKind::Path(None, path)))) => { @@ -1140,7 +1141,7 @@ impl<'a> Parser<'a> { Ok((fields, ..)) if snapshot.eat(&token::CloseDelim(token::Paren)) => { // We are certain we have `Enum::Foo(a: 3, b: 4)`, suggest // `Enum::Foo { a: 3, b: 4 }` or `Enum::Foo(3, 4)`. - *self = snapshot; + self.restore_snapshot(snapshot); let close_paren = self.prev_token.span; let span = lo.to(self.prev_token.span); if !fields.is_empty() {