about summary refs log tree commit diff
path: root/src/librustc_parse
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2020-07-14 10:35:59 -0700
committerEsteban Küber <esteban@kuber.com.ar>2020-07-14 18:30:44 -0700
commitce3bd29c68a4fa78b95de7b98241726e5ba4f5e3 (patch)
treeb970c719c555394bc74d44cc66b0bc81cfa70517 /src/librustc_parse
parent23744c84d9c0f8e4e870edb983f1ad6d33449c34 (diff)
Handle case of incomplete local ty more gracefully
When encountering a local binding with a type that isn't completed, the
parser will reach a `=` token. When this happen, consider the type
"complete" as far as the parser is concerned to avoid further errors
being emitted by parse recovery logic.
Diffstat (limited to 'src/librustc_parse')
-rw-r--r--src/librustc_parse/parser/stmt.rs14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/librustc_parse/parser/stmt.rs b/src/librustc_parse/parser/stmt.rs
index 53f32b7c800..d04920de47f 100644
--- a/src/librustc_parse/parser/stmt.rs
+++ b/src/librustc_parse/parser/stmt.rs
@@ -162,13 +162,19 @@ impl<'a> Parser<'a> {
             match self.parse_ty() {
                 Ok(ty) => (None, Some(ty)),
                 Err(mut err) => {
-                    // Rewind to before attempting to parse the type and continue parsing.
-                    let parser_snapshot_after_type =
-                        mem::replace(self, parser_snapshot_before_type);
                     if let Ok(snip) = self.span_to_snippet(pat.span) {
                         err.span_label(pat.span, format!("while parsing the type for `{}`", snip));
                     }
-                    (Some((parser_snapshot_after_type, colon_sp, err)), None)
+                    let err = if self.check(&token::Eq) {
+                        err.emit();
+                        None
+                    } else {
+                        // Rewind to before attempting to parse the type and continue parsing.
+                        let parser_snapshot_after_type =
+                            mem::replace(self, parser_snapshot_before_type);
+                        Some((parser_snapshot_after_type, colon_sp, err))
+                    };
+                    (err, None)
                 }
             }
         } else {