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:
Nicholas Nethercote 2025-04-07 13:54:24 +10:00
parent eb5d8923fc
commit e177921ae9
3 changed files with 40 additions and 3 deletions

View File

@ -782,9 +782,16 @@ impl<'a> Parser<'a> {
// Recovery is disabled when parsing macro arguments, so it must
// also be disabled when reparsing pasted macro arguments,
// otherwise we get inconsistent results (e.g. #137874).
let res = self.with_recovery(Recovery::Forbidden, |this| {
f(this).expect("failed to reparse {mv_kind:?}")
});
let res = self.with_recovery(Recovery::Forbidden, |this| f(this));
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
&& let Delimiter::Invisible(InvisibleOrigin::MetaVar(mv_kind)) = delim

View 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 ``
}

View 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