Skip to content

Commit cddaf74

Browse files
authored
Merge pull request #18625 from Veykril/push-npnxwpxuzlqz
fix: Fix parser getting stuck for bad asm expressions
2 parents 150b0e7 + 4a24e72 commit cddaf74

File tree

4 files changed

+71
-4
lines changed

4 files changed

+71
-4
lines changed

crates/parser/src/grammar/expressions/atom.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,7 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
345345
name(p);
346346
p.bump(T![=]);
347347
allow_templates = false;
348-
true
349-
} else {
350-
false
351-
};
348+
}
352349

353350
let op = p.start();
354351
let dir_spec = p.start();
@@ -399,6 +396,19 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
399396
op.abandon(p);
400397
op_n.abandon(p);
401398
p.err_and_bump("expected asm operand");
399+
400+
// improves error recovery and handles err_and_bump recovering from `{` which gets
401+
// the parser stuck here
402+
if p.at(T!['{']) {
403+
// test_err bad_asm_expr
404+
// fn foo() {
405+
// builtin#asm(
406+
// label crashy = { return; }
407+
// );
408+
// }
409+
expr(p);
410+
}
411+
402412
if p.at(T!['}']) {
403413
break;
404414
}

crates/parser/test_data/generated/runner.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,8 @@ mod err {
711711
run_and_expect_errors("test_data/parser/inline/err/async_without_semicolon.rs");
712712
}
713713
#[test]
714+
fn bad_asm_expr() { run_and_expect_errors("test_data/parser/inline/err/bad_asm_expr.rs"); }
715+
#[test]
714716
fn comma_after_functional_update_syntax() {
715717
run_and_expect_errors(
716718
"test_data/parser/inline/err/comma_after_functional_update_syntax.rs",
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
SOURCE_FILE
2+
FN
3+
FN_KW "fn"
4+
WHITESPACE " "
5+
NAME
6+
IDENT "foo"
7+
PARAM_LIST
8+
L_PAREN "("
9+
R_PAREN ")"
10+
WHITESPACE " "
11+
BLOCK_EXPR
12+
STMT_LIST
13+
L_CURLY "{"
14+
WHITESPACE "\n "
15+
EXPR_STMT
16+
ASM_EXPR
17+
BUILTIN_KW "builtin"
18+
POUND "#"
19+
ASM_KW "asm"
20+
L_PAREN "("
21+
WHITESPACE "\n "
22+
PATH_EXPR
23+
PATH
24+
PATH_SEGMENT
25+
NAME_REF
26+
IDENT "label"
27+
WHITESPACE " "
28+
NAME
29+
IDENT "crashy"
30+
WHITESPACE " "
31+
EQ "="
32+
WHITESPACE " "
33+
BLOCK_EXPR
34+
STMT_LIST
35+
L_CURLY "{"
36+
WHITESPACE " "
37+
EXPR_STMT
38+
RETURN_EXPR
39+
RETURN_KW "return"
40+
SEMICOLON ";"
41+
WHITESPACE " "
42+
R_CURLY "}"
43+
WHITESPACE "\n "
44+
R_PAREN ")"
45+
SEMICOLON ";"
46+
WHITESPACE "\n"
47+
R_CURLY "}"
48+
WHITESPACE "\n"
49+
error 41: expected COMMA
50+
error 50: expected asm operand
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
fn foo() {
2+
builtin#asm(
3+
label crashy = { return; }
4+
);
5+
}

0 commit comments

Comments
 (0)