Skip to content

Commit 3ead6de

Browse files
committed
Tweak incorrect discriminator value variant error
1 parent 7feb802 commit 3ead6de

File tree

5 files changed

+53
-26
lines changed

5 files changed

+53
-26
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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 })

src/test/ui/parser/issue-17383.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
enum X {
2-
A =
3-
b'a' //~ ERROR discriminator values can only be used with a field-less enum
4-
,
5-
B(isize)
2+
A = 3,
3+
//~^ ERROR discriminator values can only be used with a field-less enum
4+
B(usize)
65
}
76

87
fn main() {}

src/test/ui/parser/issue-17383.stderr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: discriminator values can only be used with a field-less enum
2-
--> $DIR/issue-17383.rs:3:9
2+
--> $DIR/issue-17383.rs:2:9
33
|
4-
LL | b'a' //~ ERROR discriminator values can only be used with a field-less enum
5-
| ^^^^
4+
LL | A = 3,
5+
| ^ only valid in field-less enums
66

77
error: aborting due to previous error
88

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
//error-pattern: discriminator values can only be used with a field-less enum
21

3-
enum color {
4-
red = 0xff0000,
5-
green = 0x00ff00,
6-
blue = 0x0000ff,
7-
black = 0x000000,
8-
white = 0xffffff,
9-
other (str),
2+
enum Color {
3+
Red = 0xff0000,
4+
//~^ ERROR discriminator values can only be used with a field-less enum
5+
Green = 0x00ff00,
6+
Blue = 0x0000ff,
7+
Black = 0x000000,
8+
White = 0xffffff,
9+
Other (str),
10+
//~^ ERROR the size for values of type
11+
// the above is kept in order to verify that we get beyond parse errors
1012
}
1113

1214
fn main() {}
Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,28 @@
11
error: discriminator values can only be used with a field-less enum
2-
--> $DIR/tag-variant-disr-non-nullary.rs:8:13
2+
--> $DIR/tag-variant-disr-non-nullary.rs:3:11
33
|
4-
LL | white = 0xffffff,
5-
| ^^^^^^^^
4+
LL | Red = 0xff0000,
5+
| ^^^^^^^^ only valid in field-less enums
6+
LL | //~^ ERROR discriminator values can only be used with a field-less enum
7+
LL | Green = 0x00ff00,
8+
| ^^^^^^^^ only valid in field-less enums
9+
LL | Blue = 0x0000ff,
10+
| ^^^^^^^^ only valid in field-less enums
11+
LL | Black = 0x000000,
12+
| ^^^^^^^^ only valid in field-less enums
13+
LL | White = 0xffffff,
14+
| ^^^^^^^^ only valid in field-less enums
615

7-
error: aborting due to previous error
16+
error[E0277]: the size for values of type `str` cannot be known at compilation time
17+
--> $DIR/tag-variant-disr-non-nullary.rs:9:12
18+
|
19+
LL | Other (str),
20+
| ^^^ doesn't have a size known at compile-time
21+
|
22+
= help: the trait `std::marker::Sized` is not implemented for `str`
23+
= note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
24+
= note: no field of an enum variant may have a dynamically sized type
25+
26+
error: aborting due to 2 previous errors
827

28+
For more information about this error, try `rustc --explain E0277`.

0 commit comments

Comments
 (0)