1
Fork 0

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