Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit eefb755

Browse files
committedApr 7, 2025·
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.
1 parent fd4dc18 commit eefb755

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed
 

‎compiler/rustc_parse/src/parser/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,10 @@ impl<'a> Parser<'a> {
793793
self.bump();
794794
Some(res)
795795
} else {
796-
panic!("no close delim when reparsing {mv_kind:?}");
796+
// This can occur when invalid syntax is passed to a decl macro. E.g. see #139248,
797+
// where the reparse attempt of an invalid expr consumed the trailing invisible
798+
// delimiter.
799+
None
797800
}
798801
} else {
799802
None
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// This code caused a "no close delim when reparsing Expr" ICE in #139248.
2+
3+
macro_rules! m {
4+
(static a : () = $e:expr) => {
5+
static a : () = $e;
6+
//~^ ERROR macro expansion ends with an incomplete expression: expected expression
7+
}
8+
}
9+
10+
m! { static a : () = (if b) }
11+
//~^ error: expected `{`, found `)`
12+
//~| error: expected `{`, found `)`
13+
14+
fn main() {}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
error: expected `{`, found `)`
2+
--> $DIR/no-close-delim-issue-139248.rs:10:27
3+
|
4+
LL | m! { static a : () = (if b) }
5+
| ^ expected `{`
6+
|
7+
note: the `if` expression is missing a block after this condition
8+
--> $DIR/no-close-delim-issue-139248.rs:10:26
9+
|
10+
LL | m! { static a : () = (if b) }
11+
| ^
12+
13+
error: expected `{`, found `)`
14+
--> $DIR/no-close-delim-issue-139248.rs:10:27
15+
|
16+
LL | m! { static a : () = (if b) }
17+
| ^ expected `{`
18+
|
19+
note: the `if` expression is missing a block after this condition
20+
--> $DIR/no-close-delim-issue-139248.rs:10:26
21+
|
22+
LL | m! { static a : () = (if b) }
23+
| ^
24+
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
25+
26+
error: macro expansion ends with an incomplete expression: expected expression
27+
--> $DIR/no-close-delim-issue-139248.rs:5:28
28+
|
29+
LL | static a : () = $e;
30+
| ^ expected expression
31+
32+
error: aborting due to 3 previous errors
33+

0 commit comments

Comments
 (0)
Please sign in to comment.