Allow for reparsing failure when reparsing a pasted metavar.
Fixes #139445. The additional errors aren't great but the first one is still good and it's the most important, and imperfect errors are better than ICEing.
This commit is contained in:
parent
eb5d8923fc
commit
e177921ae9
3 changed files with 40 additions and 3 deletions
|
@ -782,9 +782,16 @@ impl<'a> Parser<'a> {
|
||||||
// Recovery is disabled when parsing macro arguments, so it must
|
// Recovery is disabled when parsing macro arguments, so it must
|
||||||
// also be disabled when reparsing pasted macro arguments,
|
// also be disabled when reparsing pasted macro arguments,
|
||||||
// otherwise we get inconsistent results (e.g. #137874).
|
// otherwise we get inconsistent results (e.g. #137874).
|
||||||
let res = self.with_recovery(Recovery::Forbidden, |this| {
|
let res = self.with_recovery(Recovery::Forbidden, |this| f(this));
|
||||||
f(this).expect("failed to reparse {mv_kind:?}")
|
|
||||||
});
|
let res = match res {
|
||||||
|
Ok(res) => res,
|
||||||
|
Err(err) => {
|
||||||
|
// This can occur in unusual error cases, e.g. #139445.
|
||||||
|
err.delay_as_bug();
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if let token::CloseDelim(delim) = self.token.kind
|
if let token::CloseDelim(delim) = self.token.kind
|
||||||
&& let Delimiter::Invisible(InvisibleOrigin::MetaVar(mv_kind)) = delim
|
&& let Delimiter::Invisible(InvisibleOrigin::MetaVar(mv_kind)) = delim
|
||||||
|
|
6
tests/ui/macros/failed-to-reparse-issue-139445.rs
Normal file
6
tests/ui/macros/failed-to-reparse-issue-139445.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
fn main() {
|
||||||
|
assert_eq!(3, 'a,)
|
||||||
|
//~^ ERROR expected `while`, `for`, `loop` or `{` after a label
|
||||||
|
//~| ERROR expected `while`, `for`, `loop` or `{` after a label
|
||||||
|
//~| ERROR expected expression, found ``
|
||||||
|
}
|
24
tests/ui/macros/failed-to-reparse-issue-139445.stderr
Normal file
24
tests/ui/macros/failed-to-reparse-issue-139445.stderr
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
error: expected `while`, `for`, `loop` or `{` after a label
|
||||||
|
--> $DIR/failed-to-reparse-issue-139445.rs:2:21
|
||||||
|
|
|
||||||
|
LL | assert_eq!(3, 'a,)
|
||||||
|
| ^ expected `while`, `for`, `loop` or `{` after a label
|
||||||
|
|
||||||
|
error: expected `while`, `for`, `loop` or `{` after a label
|
||||||
|
--> $DIR/failed-to-reparse-issue-139445.rs:2:5
|
||||||
|
|
|
||||||
|
LL | assert_eq!(3, 'a,)
|
||||||
|
| ^^^^^^^^^^^^^^^^^^ expected `while`, `for`, `loop` or `{` after a label
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error: expected expression, found ``
|
||||||
|
--> $DIR/failed-to-reparse-issue-139445.rs:2:5
|
||||||
|
|
|
||||||
|
LL | assert_eq!(3, 'a,)
|
||||||
|
| ^^^^^^^^^^^^^^^^^^ expected expression
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue