diff options
| author | bors <bors@rust-lang.org> | 2022-03-18 14:50:29 +0000 | 
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-03-18 14:50:29 +0000 | 
| commit | 1bfe40d11c3630254504fb73eeccfca28d50df52 (patch) | |
| tree | 54e8e543d73f051ddee3bb7f52ba8f955c8e6c36 | |
| parent | a8adf7685a4ddd16e985d34d9838a75a04ca4181 (diff) | |
| parent | 201a86046c3b08820c6b44b85c640c187d87756b (diff) | |
| download | rust-1bfe40d11c3630254504fb73eeccfca28d50df52.tar.gz rust-1bfe40d11c3630254504fb73eeccfca28d50df52.zip | |
Auto merge of #95068 - TaKO8Ki:use-create-snapshot-for-diagnostic, r=davidtwco
Use `Parser.create_snapshot_for_diagnostic` instead of `Parser.clone()` Use [`create_snapshot_for_diagnostic`](https://github.com/rust-lang/rust/blob/cd119057160cedea245aa2679add56723f3dc784/compiler/rustc_parse/src/parser/diagnostics.rs#L214-L223) I implemented in https://github.com/rust-lang/rust/pull/94731 instead of `self.clone()` to avoid duplicate unclosed delims errors being emitted when the `Parser` is dropped.
| -rw-r--r-- | compiler/rustc_parse/src/parser/expr.rs | 11 | 
1 files changed, 6 insertions, 5 deletions
| diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index ef006d5fcda..a907f50a11b 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<Expr>>, - snapshot: Option<(Self, ExprKind)>, + snapshot: Option<(SnapshotParser<'a>, ExprKind)>, ) -> Option<P<Expr>> { 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() { | 
