| 
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