Tweak incorrect discriminator value variant error
This commit is contained in:
parent
7feb802d89
commit
3ead6de40d
5 changed files with 53 additions and 26 deletions
|
@ -6983,7 +6983,7 @@ impl<'a> Parser<'a> {
|
||||||
fn parse_enum_def(&mut self, _generics: &ast::Generics) -> PResult<'a, EnumDef> {
|
fn parse_enum_def(&mut self, _generics: &ast::Generics) -> PResult<'a, EnumDef> {
|
||||||
let mut variants = Vec::new();
|
let mut variants = Vec::new();
|
||||||
let mut all_nullary = true;
|
let mut all_nullary = true;
|
||||||
let mut any_disr = None;
|
let mut any_disr = vec![];
|
||||||
while self.token != token::CloseDelim(token::Brace) {
|
while self.token != token::CloseDelim(token::Brace) {
|
||||||
let variant_attrs = self.parse_outer_attributes()?;
|
let variant_attrs = self.parse_outer_attributes()?;
|
||||||
let vlo = self.span;
|
let vlo = self.span;
|
||||||
|
@ -7005,7 +7005,9 @@ impl<'a> Parser<'a> {
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
value: self.parse_expr()?,
|
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);
|
struct_def = VariantData::Unit(ast::DUMMY_NODE_ID);
|
||||||
} else {
|
} else {
|
||||||
struct_def = VariantData::Unit(ast::DUMMY_NODE_ID);
|
struct_def = VariantData::Unit(ast::DUMMY_NODE_ID);
|
||||||
|
@ -7022,11 +7024,15 @@ impl<'a> Parser<'a> {
|
||||||
if !self.eat(&token::Comma) { break; }
|
if !self.eat(&token::Comma) { break; }
|
||||||
}
|
}
|
||||||
self.expect(&token::CloseDelim(token::Brace))?;
|
self.expect(&token::CloseDelim(token::Brace))?;
|
||||||
match any_disr {
|
if !any_disr.is_empty() && !all_nullary {
|
||||||
Some(disr_span) if !all_nullary =>
|
let mut err =self.struct_span_err(
|
||||||
self.span_err(disr_span,
|
any_disr.clone(),
|
||||||
"discriminator values can only be used with a field-less enum"),
|
"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 })
|
Ok(ast::EnumDef { variants })
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
enum X {
|
enum X {
|
||||||
A =
|
A = 3,
|
||||||
b'a' //~ ERROR discriminator values can only be used with a field-less enum
|
//~^ ERROR discriminator values can only be used with a field-less enum
|
||||||
,
|
B(usize)
|
||||||
B(isize)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
error: discriminator values can only be used with a field-less enum
|
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: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
//error-pattern: discriminator values can only be used with a field-less enum
|
|
||||||
|
|
||||||
enum color {
|
enum Color {
|
||||||
red = 0xff0000,
|
Red = 0xff0000,
|
||||||
green = 0x00ff00,
|
//~^ ERROR discriminator values can only be used with a field-less enum
|
||||||
blue = 0x0000ff,
|
Green = 0x00ff00,
|
||||||
black = 0x000000,
|
Blue = 0x0000ff,
|
||||||
white = 0xffffff,
|
Black = 0x000000,
|
||||||
other (str),
|
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() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,8 +1,28 @@
|
||||||
error: discriminator values can only be used with a field-less enum
|
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`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue