fn parse_enum_def(&mut self, _generics: &ast::Generics) -> PResult<'a, EnumDef> {
let mut variants = Vec::new();
let mut all_nullary = true;
- let mut any_disr = None;
+ let mut any_disr = vec![];
while self.token != token::CloseDelim(token::Brace) {
let variant_attrs = self.parse_outer_attributes()?;
let vlo = self.span;
id: ast::DUMMY_NODE_ID,
value: self.parse_expr()?,
});
- any_disr = disr_expr.as_ref().map(|c| c.value.span);
+ 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);
if !self.eat(&token::Comma) { break; }
}
self.expect(&token::CloseDelim(token::Brace))?;
- match any_disr {
- Some(disr_span) if !all_nullary =>
- self.span_err(disr_span,
- "discriminator values can only be used with a field-less enum"),
- _ => ()
+ if !any_disr.is_empty() && !all_nullary {
+ let mut err =self.struct_span_err(
+ any_disr.clone(),
+ "discriminator values can only be used with a field-less enum",
+ );
+ for sp in any_disr {
+ err.span_label(sp, "only valid in field-less enums");
+ }
+ err.emit();
}
Ok(ast::EnumDef { variants })
enum X {
- A =
- b'a' //~ ERROR discriminator values can only be used with a field-less enum
- ,
- B(isize)
+ A = 3,
+ //~^ ERROR discriminator values can only be used with a field-less enum
+ B(usize)
}
fn main() {}
error: discriminator values can only be used with a field-less enum
- --> $DIR/issue-17383.rs:3:9
+ --> $DIR/issue-17383.rs:2:9
|
-LL | b'a' //~ ERROR discriminator values can only be used with a field-less enum
- | ^^^^
+LL | A = 3,
+ | ^ only valid in field-less enums
error: aborting due to previous error
-//error-pattern: discriminator values can only be used with a field-less enum
-enum color {
- red = 0xff0000,
- green = 0x00ff00,
- blue = 0x0000ff,
- black = 0x000000,
- white = 0xffffff,
- other (str),
+enum Color {
+ Red = 0xff0000,
+ //~^ ERROR discriminator values can only be used with a field-less enum
+ Green = 0x00ff00,
+ Blue = 0x0000ff,
+ Black = 0x000000,
+ White = 0xffffff,
+ Other (str),
+ //~^ ERROR the size for values of type
+ // the above is kept in order to verify that we get beyond parse errors
}
fn main() {}
error: discriminator values can only be used with a field-less enum
- --> $DIR/tag-variant-disr-non-nullary.rs:8:13
+ --> $DIR/tag-variant-disr-non-nullary.rs:3:11
|
-LL | white = 0xffffff,
- | ^^^^^^^^
+LL | Red = 0xff0000,
+ | ^^^^^^^^ only valid in field-less enums
+LL | //~^ ERROR discriminator values can only be used with a field-less enum
+LL | Green = 0x00ff00,
+ | ^^^^^^^^ only valid in field-less enums
+LL | Blue = 0x0000ff,
+ | ^^^^^^^^ only valid in field-less enums
+LL | Black = 0x000000,
+ | ^^^^^^^^ only valid in field-less enums
+LL | White = 0xffffff,
+ | ^^^^^^^^ only valid in field-less enums
-error: aborting due to previous error
+error[E0277]: the size for values of type `str` cannot be known at compilation time
+ --> $DIR/tag-variant-disr-non-nullary.rs:9:12
+ |
+LL | Other (str),
+ | ^^^ doesn't have a size known at compile-time
+ |
+ = help: the trait `std::marker::Sized` is not implemented for `str`
+ = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
+ = note: no field of an enum variant may have a dynamically sized type
+
+error: aborting due to 2 previous errors
+For more information about this error, try `rustc --explain E0277`.