diff options
| author | Nicholas Nethercote <n.nethercote@gmail.com> | 2025-04-07 13:54:24 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <n.nethercote@gmail.com> | 2025-04-08 12:06:42 +1000 |
| commit | e177921ae9bca5d697e682551c27c5baefcfbb60 (patch) | |
| tree | ebe044c63f470cbd4742b362286763bd22886d7e /compiler/rustc_parse/src/parser/mod.rs | |
| parent | eb5d8923fce0a025921368d175905c9cab481954 (diff) | |
| download | rust-e177921ae9bca5d697e682551c27c5baefcfbb60.tar.gz rust-e177921ae9bca5d697e682551c27c5baefcfbb60.zip | |
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.
Diffstat (limited to 'compiler/rustc_parse/src/parser/mod.rs')
| -rw-r--r-- | compiler/rustc_parse/src/parser/mod.rs | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs index b277cb804fa..fafd1b1ae00 100644 --- a/compiler/rustc_parse/src/parser/mod.rs +++ b/compiler/rustc_parse/src/parser/mod.rs @@ -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 |
