mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-26 20:09:19 +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);
|
name(p);
|
||||||
p.bump(T![=]);
|
p.bump(T![=]);
|
||||||
allow_templates = false;
|
allow_templates = false;
|
||||||
true
|
}
|
||||||
} else {
|
|
||||||
false
|
|
||||||
};
|
|
||||||
|
|
||||||
let op = p.start();
|
let op = p.start();
|
||||||
let dir_spec = 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.abandon(p);
|
||||||
op_n.abandon(p);
|
op_n.abandon(p);
|
||||||
p.err_and_bump("expected asm operand");
|
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!['}']) {
|
if p.at(T!['}']) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -704,6 +704,8 @@ mod err {
|
||||||
run_and_expect_errors("test_data/parser/inline/err/async_without_semicolon.rs");
|
run_and_expect_errors("test_data/parser/inline/err/async_without_semicolon.rs");
|
||||||
}
|
}
|
||||||
#[test]
|
#[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() {
|
fn comma_after_functional_update_syntax() {
|
||||||
run_and_expect_errors(
|
run_and_expect_errors(
|
||||||
"test_data/parser/inline/err/comma_after_functional_update_syntax.rs",
|
"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…
Add table
Add a link
Reference in a new issue