mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-14 06:03:58 +00:00
fix: Fix parser getting stuck for bad asm expressions
This commit is contained in:
parent
2fd06545a6
commit
4a24e729b0
4 changed files with 71 additions and 4 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
50
crates/parser/test_data/parser/inline/err/bad_asm_expr.rast
Normal file
50
crates/parser/test_data/parser/inline/err/bad_asm_expr.rast
Normal 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
|
|
@ -0,0 +1,5 @@
|
|||
fn foo() {
|
||||
builtin#asm(
|
||||
label crashy = { return; }
|
||||
);
|
||||
}
|
Loading…
Reference in a new issue