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 a2a081a

Browse files
committedApr 3, 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 4f0de4c commit a2a081a

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed
 

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,10 @@ impl<'a> Parser<'a> {
778778
self.bump();
779779
Some(res)
780780
} else {
781-
panic!("no close delim when reparsing {mv_kind:?}");
781+
// This can occur when invalid syntax is passed to a decl macro. E.g. see #139248,
782+
// where the reparse attempt of an invalid expr consumed the trailing invisible
783+
// delimiter.
784+
None
782785
}
783786
} else {
784787
None
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// This code caused a "no close delim when reparsing Expr" ICE in #139248.
2+
3+
thread_local! { static a : () = (if b) }
4+
//~^ error: expected `{`, found `)`
5+
//~| error: expected `{`, found `)`
6+
//~| error: expected `{`, found `)`
7+
//~| error: expected expression, found end of macro arguments
8+
9+
fn main() {}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
error: expected `{`, found `)`
2+
--> $DIR/no-close-delim-issue-139248.rs:3:38
3+
|
4+
LL | thread_local! { 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:3:37
9+
|
10+
LL | thread_local! { static a : () = (if b) }
11+
| ^
12+
13+
error: expected `{`, found `)`
14+
--> $DIR/no-close-delim-issue-139248.rs:3:38
15+
|
16+
LL | thread_local! { 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:3:37
21+
|
22+
LL | thread_local! { static a : () = (if b) }
23+
| ^
24+
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
25+
26+
error: expected `{`, found `)`
27+
--> $DIR/no-close-delim-issue-139248.rs:3:38
28+
|
29+
LL | thread_local! { static a : () = (if b) }
30+
| ^ expected `{`
31+
|
32+
note: the `if` expression is missing a block after this condition
33+
--> $DIR/no-close-delim-issue-139248.rs:3:37
34+
|
35+
LL | thread_local! { static a : () = (if b) }
36+
| ^
37+
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
38+
39+
error: expected expression, found end of macro arguments
40+
--> $DIR/no-close-delim-issue-139248.rs:3:1
41+
|
42+
LL | thread_local! { static a : () = (if b) }
43+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected expression
44+
--> $SRC_DIR/std/src/sys/thread_local/native/mod.rs:LL:COL
45+
|
46+
= note: while parsing argument for this `expr` macro fragment
47+
|
48+
= note: this error originates in the macro `thread_local` (in Nightly builds, run with -Z macro-backtrace for more info)
49+
50+
error: aborting due to 4 previous errors
51+

0 commit comments

Comments
 (0)
Please sign in to comment.