diff options
| author | John Wrenn <john_wrenn@brown.edu> | 2019-05-09 17:08:55 -0400 |
|---|---|---|
| committer | John Wrenn <john_wrenn@brown.edu> | 2019-06-21 11:00:10 -0400 |
| commit | ac98342e846e79985f0c4969a2d546dee24a70d1 (patch) | |
| tree | 8c2ff20debabdd8f9c9f7476f1b2d3868192f6cd /src/libsyntax/parse/parser.rs | |
| parent | 38cd9489f75f4a4387296ee304e2287f7c32c211 (diff) | |
| download | rust-ac98342e846e79985f0c4969a2d546dee24a70d1.tar.gz rust-ac98342e846e79985f0c4969a2d546dee24a70d1.zip | |
Implement arbitrary_enum_discriminant
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index fa697e06d26..2718ddded29 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -6963,36 +6963,34 @@ impl<'a> Parser<'a> { /// Parses the part of an enum declaration following the `{`. fn parse_enum_def(&mut self, _generics: &ast::Generics) -> PResult<'a, EnumDef> { let mut variants = Vec::new(); - let mut any_disr = vec![]; while self.token != token::CloseDelim(token::Brace) { let variant_attrs = self.parse_outer_attributes()?; let vlo = self.token.span; - let struct_def; - let mut disr_expr = None; self.eat_bad_pub(); let ident = self.parse_ident()?; - if self.check(&token::OpenDelim(token::Brace)) { + + let struct_def = if self.check(&token::OpenDelim(token::Brace)) { // Parse a struct variant. let (fields, recovered) = self.parse_record_struct_body()?; - struct_def = VariantData::Struct(fields, recovered); + VariantData::Struct(fields, recovered) } else if self.check(&token::OpenDelim(token::Paren)) { - struct_def = VariantData::Tuple( + VariantData::Tuple( self.parse_tuple_struct_body()?, ast::DUMMY_NODE_ID, - ); - } else if self.eat(&token::Eq) { - disr_expr = Some(AnonConst { + ) + } else { + VariantData::Unit(ast::DUMMY_NODE_ID) + }; + + let disr_expr = if self.eat(&token::Eq) { + Some(AnonConst { id: ast::DUMMY_NODE_ID, value: self.parse_expr()?, - }); - if let Some(sp) = disr_expr.as_ref().map(|c| c.value.span) { - any_disr.push(sp); - } - struct_def = VariantData::Unit(ast::DUMMY_NODE_ID); + }) } else { - struct_def = VariantData::Unit(ast::DUMMY_NODE_ID); - } + None + }; let vr = ast::Variant_ { ident, @@ -7020,7 +7018,6 @@ impl<'a> Parser<'a> { } } self.expect(&token::CloseDelim(token::Brace))?; - self.maybe_report_invalid_custom_discriminants(any_disr, &variants); Ok(ast::EnumDef { variants }) } |
