From 2e812c1c5f1502487bdcbeef938c3dbe6a0d7e05 Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Tue, 31 Dec 2019 03:36:45 +0100 Subject: [PATCH] parser::pat: remove .fatal calls --- src/librustc_parse/parser/pat.rs | 26 +++++++++++-------- ...brace-after-qualified-path-in-match.stderr | 4 ++- ...paren-after-qualified-path-in-match.stderr | 4 ++- .../suggestions/vec-macro-in-pattern.stderr | 3 ++- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/librustc_parse/parser/pat.rs b/src/librustc_parse/parser/pat.rs index 4895d5428df..e608b86c76a 100644 --- a/src/librustc_parse/parser/pat.rs +++ b/src/librustc_parse/parser/pat.rs @@ -673,7 +673,7 @@ fn fatal_unexpected_non_pat( let expected = expected.unwrap_or("pattern"); let msg = format!("expected {}, found {}", expected, super::token_descr(&self.token)); - let mut err = self.fatal(&msg); + let mut err = self.struct_span_err(self.token.span, &msg); err.span_label(self.token.span, format!("expected {}", expected)); let sp = self.sess.source_map().start_point(self.token.span); @@ -807,12 +807,8 @@ fn parse_pat_ident(&mut self, binding_mode: BindingMode) -> PResult<'a, PatKind> /// Parse a struct ("record") pattern (e.g. `Foo { ... }` or `Foo::Bar { ... }`). fn parse_pat_struct(&mut self, qself: Option, path: Path) -> PResult<'a, PatKind> { if qself.is_some() { - let msg = "unexpected `{` after qualified path"; - let mut err = self.fatal(msg); - err.span_label(self.token.span, msg); - return Err(err); + return self.error_qpath_before_pat(&path, "{"); } - self.bump(); let (fields, etc) = self.parse_pat_fields().unwrap_or_else(|mut e| { e.emit(); @@ -826,15 +822,22 @@ fn parse_pat_struct(&mut self, qself: Option, path: Path) -> PResult<'a, /// Parse tuple struct or tuple variant pattern (e.g. `Foo(...)` or `Foo::Bar(...)`). fn parse_pat_tuple_struct(&mut self, qself: Option, path: Path) -> PResult<'a, PatKind> { if qself.is_some() { - let msg = "unexpected `(` after qualified path"; - let mut err = self.fatal(msg); - err.span_label(self.token.span, msg); - return Err(err); + return self.error_qpath_before_pat(&path, "("); } let (fields, _) = self.parse_paren_comma_seq(|p| p.parse_pat_with_or_inner())?; Ok(PatKind::TupleStruct(path, fields)) } + /// Error when there's a qualified path, e.g. `::Baz` + /// as the path of e.g., a tuple or record struct pattern. + fn error_qpath_before_pat(&mut self, path: &Path, token: &str) -> PResult<'a, PatKind> { + let msg = &format!("unexpected `{}` after qualified path", token); + let mut err = self.struct_span_err(self.token.span, msg); + err.span_label(self.token.span, msg); + err.span_label(path.span, "the qualified path"); + Err(err) + } + /// Parses the fields of a struct-like pattern. fn parse_pat_fields(&mut self) -> PResult<'a, (Vec, bool)> { let mut fields = Vec::new(); @@ -877,7 +880,8 @@ fn parse_pat_fields(&mut self) -> PResult<'a, (Vec, bool)> { break; } let token_str = super::token_descr(&self.token); - let mut err = self.fatal(&format!("expected `}}`, found {}", token_str)); + let msg = &format!("expected `}}`, found {}", token_str); + let mut err = self.struct_span_err(self.token.span, msg); err.span_label(self.token.span, "expected `}`"); let mut comma_sp = None; diff --git a/src/test/ui/parser/brace-after-qualified-path-in-match.stderr b/src/test/ui/parser/brace-after-qualified-path-in-match.stderr index 4c49e3122c7..d6fdf353f07 100644 --- a/src/test/ui/parser/brace-after-qualified-path-in-match.stderr +++ b/src/test/ui/parser/brace-after-qualified-path-in-match.stderr @@ -2,7 +2,9 @@ error: unexpected `{` after qualified path --> $DIR/brace-after-qualified-path-in-match.rs:3:27 | LL | ::Type{key: value} => (), - | ^ unexpected `{` after qualified path + | ------------------^ unexpected `{` after qualified path + | | + | the qualified path error: aborting due to previous error diff --git a/src/test/ui/parser/paren-after-qualified-path-in-match.stderr b/src/test/ui/parser/paren-after-qualified-path-in-match.stderr index 79460e01f25..af21f919546 100644 --- a/src/test/ui/parser/paren-after-qualified-path-in-match.stderr +++ b/src/test/ui/parser/paren-after-qualified-path-in-match.stderr @@ -2,7 +2,9 @@ error: unexpected `(` after qualified path --> $DIR/paren-after-qualified-path-in-match.rs:3:27 | LL | ::Type(2) => (), - | ^ unexpected `(` after qualified path + | ------------------^ unexpected `(` after qualified path + | | + | the qualified path error: aborting due to previous error diff --git a/src/test/ui/suggestions/vec-macro-in-pattern.stderr b/src/test/ui/suggestions/vec-macro-in-pattern.stderr index 59ca8ebbf63..1634fdde7d2 100644 --- a/src/test/ui/suggestions/vec-macro-in-pattern.stderr +++ b/src/test/ui/suggestions/vec-macro-in-pattern.stderr @@ -5,11 +5,12 @@ LL | Some(vec![_x]) => (), | ^^^^^^^^ | | | unexpected `(` after qualified path + | the qualified path | in this macro invocation | help: use a slice pattern here instead: `[_x]` | = help: for more information, see https://doc.rust-lang.org/edition-guide/rust-2018/slice-patterns.html - = note: this warning originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) error: aborting due to previous error -- 2.44.0