Rollup merge of #105098 - lyming2007:issue-103869-fix, r=eholk
propagate the error from parsing enum variant to the parser and emit out While parsing enum variant, the error message always disappear Because the error message that emit out is from main error of parser The information of enum variant disappears while parsing enum variant with error We only check the syntax of expecting token, i.e, in case https://github.com/rust-lang/rust/issues/103869 It will error it without telling the message that this error is from pasring enum variant. Propagate the sub-error from parsing enum variant to the main error of parser by chaining it with map_err Check the sub-error before emitting the main error of parser and attach it. Fix https://github.com/rust-lang/rust/issues/103869
This commit is contained in:
commit
48172ff64b
@ -1414,7 +1414,10 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
Ok((Some(vr), TrailingToken::MaybeComma))
|
Ok((Some(vr), TrailingToken::MaybeComma))
|
||||||
},
|
},
|
||||||
)
|
).map_err(|mut err|{
|
||||||
|
err.help("enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`");
|
||||||
|
err
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses `struct Foo { ... }`.
|
/// Parses `struct Foo { ... }`.
|
||||||
|
@ -943,6 +943,10 @@ impl<'a> Parser<'a> {
|
|||||||
Err(e) => {
|
Err(e) => {
|
||||||
// Parsing failed, therefore it must be something more serious
|
// Parsing failed, therefore it must be something more serious
|
||||||
// than just a missing separator.
|
// than just a missing separator.
|
||||||
|
for xx in &e.children {
|
||||||
|
// propagate the help message from sub error 'e' to main error 'expect_err;
|
||||||
|
expect_err.children.push(xx.clone());
|
||||||
|
}
|
||||||
expect_err.emit();
|
expect_err.emit();
|
||||||
|
|
||||||
e.cancel();
|
e.cancel();
|
||||||
|
@ -7,6 +7,7 @@ LL | $token $($inner)? = $value,
|
|||||||
LL | values!(STRING(1) as (String) => cfg(test),);
|
LL | values!(STRING(1) as (String) => cfg(test),);
|
||||||
| -------------------------------------------- in this macro invocation
|
| -------------------------------------------- in this macro invocation
|
||||||
|
|
|
|
||||||
|
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
|
||||||
= note: this error originates in the macro `values` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `values` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: macro expansion ignores token `(String)` and any following
|
error: macro expansion ignores token `(String)` and any following
|
||||||
|
@ -3,6 +3,8 @@ error: unexpected `==`
|
|||||||
|
|
|
|
||||||
LL | B == 2
|
LL | B == 2
|
||||||
| ^^ help: try using `=` instead
|
| ^^ help: try using `=` instead
|
||||||
|
|
|
||||||
|
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
|
||||||
|
|
||||||
error: expected item, found `==`
|
error: expected item, found `==`
|
||||||
--> $DIR/issue-101477-enum.rs:6:7
|
--> $DIR/issue-101477-enum.rs:6:7
|
||||||
|
9
src/test/ui/parser/issue-103869.rs
Normal file
9
src/test/ui/parser/issue-103869.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
enum VecOrMap{
|
||||||
|
vec: Vec<usize>,
|
||||||
|
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
|
||||||
|
//~| HELP: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
|
||||||
|
//~| ERROR expected item, found `:`
|
||||||
|
map: HashMap<String,usize>
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
16
src/test/ui/parser/issue-103869.stderr
Normal file
16
src/test/ui/parser/issue-103869.stderr
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
error: expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
|
||||||
|
--> $DIR/issue-103869.rs:2:8
|
||||||
|
|
|
||||||
|
LL | vec: Vec<usize>,
|
||||||
|
| ^ expected one of `(`, `,`, `=`, `{`, or `}`
|
||||||
|
|
|
||||||
|
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
|
||||||
|
|
||||||
|
error: expected item, found `:`
|
||||||
|
--> $DIR/issue-103869.rs:2:8
|
||||||
|
|
|
||||||
|
LL | vec: Vec<usize>,
|
||||||
|
| ^ expected item
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
@ -9,6 +9,7 @@ LL | $( $t, )*
|
|||||||
LL | test_macro!(String,);
|
LL | test_macro!(String,);
|
||||||
| -------------------- in this macro invocation
|
| -------------------- in this macro invocation
|
||||||
|
|
|
|
||||||
|
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
|
||||||
= note: this error originates in the macro `test_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `test_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
@ -28,6 +28,7 @@ enum E {
|
|||||||
//~^ ERROR functions are not allowed in enum definitions
|
//~^ ERROR functions are not allowed in enum definitions
|
||||||
//~| HELP unlike in C++, Java, and C#, functions are declared in `impl` blocks
|
//~| HELP unlike in C++, Java, and C#, functions are declared in `impl` blocks
|
||||||
//~| HELP see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information
|
//~| HELP see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information
|
||||||
|
//~| HELP enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -33,6 +33,7 @@ LL | fn foo() {}
|
|||||||
|
|
|
|
||||||
= help: unlike in C++, Java, and C#, functions are declared in `impl` blocks
|
= help: unlike in C++, Java, and C#, functions are declared in `impl` blocks
|
||||||
= help: see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information
|
= help: see https://doc.rust-lang.org/book/ch05-03-method-syntax.html for more information
|
||||||
|
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user