diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2020-07-14 10:35:59 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2020-07-14 18:30:44 -0700 |
| commit | ce3bd29c68a4fa78b95de7b98241726e5ba4f5e3 (patch) | |
| tree | b970c719c555394bc74d44cc66b0bc81cfa70517 /src/librustc_parse | |
| parent | 23744c84d9c0f8e4e870edb983f1ad6d33449c34 (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.rs | 14 |
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 { |
