@@ -6983,7 +6983,7 @@ impl<'a> Parser<'a> {
69836983 fn parse_enum_def ( & mut self , _generics : & ast:: Generics ) -> PResult < ' a , EnumDef > {
69846984 let mut variants = Vec :: new ( ) ;
69856985 let mut all_nullary = true ;
6986- let mut any_disr = None ;
6986+ let mut any_disr = vec ! [ ] ;
69876987 while self . token != token:: CloseDelim ( token:: Brace ) {
69886988 let variant_attrs = self . parse_outer_attributes ( ) ?;
69896989 let vlo = self . span ;
@@ -7005,7 +7005,9 @@ impl<'a> Parser<'a> {
70057005 id : ast:: DUMMY_NODE_ID ,
70067006 value : self . parse_expr ( ) ?,
70077007 } ) ;
7008- any_disr = disr_expr. as_ref ( ) . map ( |c| c. value . span ) ;
7008+ if let Some ( sp) = disr_expr. as_ref ( ) . map ( |c| c. value . span ) {
7009+ any_disr. push ( sp) ;
7010+ }
70097011 struct_def = VariantData :: Unit ( ast:: DUMMY_NODE_ID ) ;
70107012 } else {
70117013 struct_def = VariantData :: Unit ( ast:: DUMMY_NODE_ID ) ;
@@ -7022,11 +7024,15 @@ impl<'a> Parser<'a> {
70227024 if !self . eat ( & token:: Comma ) { break ; }
70237025 }
70247026 self . expect ( & token:: CloseDelim ( token:: Brace ) ) ?;
7025- match any_disr {
7026- Some ( disr_span) if !all_nullary =>
7027- self . span_err ( disr_span,
7028- "discriminator values can only be used with a field-less enum" ) ,
7029- _ => ( )
7027+ if !any_disr. is_empty ( ) && !all_nullary {
7028+ let mut err =self . struct_span_err (
7029+ any_disr. clone ( ) ,
7030+ "discriminator values can only be used with a field-less enum" ,
7031+ ) ;
7032+ for sp in any_disr {
7033+ err. span_label ( sp, "only valid in field-less enums" ) ;
7034+ }
7035+ err. emit ( ) ;
70307036 }
70317037
70327038 Ok ( ast:: EnumDef { variants } )
0 commit comments