Allow for missing invisible close delim when reparsing an expression.

This can happen when invalid syntax is passed to a declarative macro. We
shouldn't be too strict about the token stream position once the parser
has rejected the invalid syntax.

Fixes #139248.
This commit is contained in:
Nicholas Nethercote 2025-04-03 14:23:49 +11:00
parent e643f59f6d
commit eb5d8923fc
3 changed files with 53 additions and 1 deletions

View file

@ -793,7 +793,12 @@ impl<'a> Parser<'a> {
self.bump();
Some(res)
} else {
panic!("no close delim when reparsing {mv_kind:?}");
// This can occur when invalid syntax is passed to a decl macro. E.g. see #139248,
// where the reparse attempt of an invalid expr consumed the trailing invisible
// delimiter.
self.dcx()
.span_delayed_bug(self.token.span, "no close delim with reparsing {mv_kind:?}");
None
}
} else {
None

View file

@ -0,0 +1,14 @@
// This code caused a "no close delim when reparsing Expr" ICE in #139248.
macro_rules! m {
(static a : () = $e:expr) => {
static a : () = $e;
//~^ ERROR macro expansion ends with an incomplete expression: expected expression
}
}
m! { static a : () = (if b) }
//~^ ERROR expected `{`, found `)`
//~| ERROR expected `{`, found `)`
fn main() {}

View file

@ -0,0 +1,33 @@
error: expected `{`, found `)`
--> $DIR/no-close-delim-issue-139248.rs:10:27
|
LL | m! { static a : () = (if b) }
| ^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/no-close-delim-issue-139248.rs:10:26
|
LL | m! { static a : () = (if b) }
| ^
error: expected `{`, found `)`
--> $DIR/no-close-delim-issue-139248.rs:10:27
|
LL | m! { static a : () = (if b) }
| ^ expected `{`
|
note: the `if` expression is missing a block after this condition
--> $DIR/no-close-delim-issue-139248.rs:10:26
|
LL | m! { static a : () = (if b) }
| ^
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: macro expansion ends with an incomplete expression: expected expression
--> $DIR/no-close-delim-issue-139248.rs:5:28
|
LL | static a : () = $e;
| ^ expected expression
error: aborting due to 3 previous errors