|
1 |
| -use super::diagnostics::{dummy_arg, ConsumeClosingDelim, Error}; |
| 1 | +use super::diagnostics::{dummy_arg, ConsumeClosingDelim, Error, UseEmptyBlockNotSemi}; |
2 | 2 | use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign};
|
3 | 3 | use super::{AttrWrapper, FollowedByType, ForceCollect, Parser, PathStyle, TrailingToken};
|
4 | 4 |
|
@@ -664,6 +664,14 @@ impl<'a> Parser<'a> {
|
664 | 664 | mut parse_item: impl FnMut(&mut Parser<'a>) -> PResult<'a, Option<Option<T>>>,
|
665 | 665 | ) -> PResult<'a, Vec<T>> {
|
666 | 666 | let open_brace_span = self.token.span;
|
| 667 | + |
| 668 | + // Recover `impl Ty;` instead of `impl Ty {}` |
| 669 | + if self.token == TokenKind::Semi { |
| 670 | + self.sess.emit_err(UseEmptyBlockNotSemi { span: self.token.span }); |
| 671 | + self.bump(); |
| 672 | + return Ok(vec![]); |
| 673 | + } |
| 674 | + |
667 | 675 | self.expect(&token::OpenDelim(Delimiter::Brace))?;
|
668 | 676 | attrs.extend(self.parse_inner_attributes()?);
|
669 | 677 |
|
@@ -1305,12 +1313,19 @@ impl<'a> Parser<'a> {
|
1305 | 1313 | let mut generics = self.parse_generics()?;
|
1306 | 1314 | generics.where_clause = self.parse_where_clause()?;
|
1307 | 1315 |
|
1308 |
| - let (variants, _) = self |
1309 |
| - .parse_delim_comma_seq(Delimiter::Brace, |p| p.parse_enum_variant()) |
1310 |
| - .map_err(|e| { |
1311 |
| - self.recover_stmt(); |
1312 |
| - e |
1313 |
| - })?; |
| 1316 | + // Possibly recover `enum Foo;` instead of `enum Foo {}` |
| 1317 | + let (variants, _) = if self.token == TokenKind::Semi { |
| 1318 | + self.sess.emit_err(UseEmptyBlockNotSemi { span: self.token.span }); |
| 1319 | + self.bump(); |
| 1320 | + (vec![], false) |
| 1321 | + } else { |
| 1322 | + self.parse_delim_comma_seq(Delimiter::Brace, |p| p.parse_enum_variant()).map_err( |
| 1323 | + |e| { |
| 1324 | + self.recover_stmt(); |
| 1325 | + e |
| 1326 | + }, |
| 1327 | + )? |
| 1328 | + }; |
1314 | 1329 |
|
1315 | 1330 | let enum_definition = EnumDef { variants: variants.into_iter().flatten().collect() };
|
1316 | 1331 | Ok((id, ItemKind::Enum(enum_definition, generics)))
|
|
0 commit comments