fix: Fix parser getting stuck for bad asm expressions

This commit is contained in:
Lukas Wirth 2024-12-06 05:53:44 +01:00
parent 2fd06545a6
commit 4a24e729b0
4 changed files with 71 additions and 4 deletions

View file

@ -345,10 +345,7 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
name(p);
p.bump(T![=]);
allow_templates = false;
true
} else {
false
};
}
let op = p.start();
let dir_spec = p.start();
@ -399,6 +396,19 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
op.abandon(p);
op_n.abandon(p);
p.err_and_bump("expected asm operand");
// improves error recovery and handles err_and_bump recovering from `{` which gets
// the parser stuck here
if p.at(T!['{']) {
// test_err bad_asm_expr
// fn foo() {
// builtin#asm(
// label crashy = { return; }
// );
// }
expr(p);
}
if p.at(T!['}']) {
break;
}

View file

@ -704,6 +704,8 @@ mod err {
run_and_expect_errors("test_data/parser/inline/err/async_without_semicolon.rs");
}
#[test]
fn bad_asm_expr() { run_and_expect_errors("test_data/parser/inline/err/bad_asm_expr.rs"); }
#[test]
fn comma_after_functional_update_syntax() {
run_and_expect_errors(
"test_data/parser/inline/err/comma_after_functional_update_syntax.rs",

View file

@ -0,0 +1,50 @@
SOURCE_FILE
FN
FN_KW "fn"
WHITESPACE " "
NAME
IDENT "foo"
PARAM_LIST
L_PAREN "("
R_PAREN ")"
WHITESPACE " "
BLOCK_EXPR
STMT_LIST
L_CURLY "{"
WHITESPACE "\n "
EXPR_STMT
ASM_EXPR
BUILTIN_KW "builtin"
POUND "#"
ASM_KW "asm"
L_PAREN "("
WHITESPACE "\n "
PATH_EXPR
PATH
PATH_SEGMENT
NAME_REF
IDENT "label"
WHITESPACE " "
NAME
IDENT "crashy"
WHITESPACE " "
EQ "="
WHITESPACE " "
BLOCK_EXPR
STMT_LIST
L_CURLY "{"
WHITESPACE " "
EXPR_STMT
RETURN_EXPR
RETURN_KW "return"
SEMICOLON ";"
WHITESPACE " "
R_CURLY "}"
WHITESPACE "\n "
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n"
R_CURLY "}"
WHITESPACE "\n"
error 41: expected COMMA
error 50: expected asm operand

View file

@ -0,0 +1,5 @@
fn foo() {
builtin#asm(
label crashy = { return; }
);
}