Skip to content

Commit 46cc200

Browse files
committed
Auto merge of rust-lang#139298 - nnethercote:fix-139248, r=<try>
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 rust-lang#139248. r? `@petrochenkov` --- try-job: test-various
2 parents 9e14530 + a2a081a commit 46cc200

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

compiler/rustc_parse/src/parser/mod.rs

+4-1
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
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() {}
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)