Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/grammar/expressions/atom.rs')
-rw-r--r--crates/parser/src/grammar/expressions/atom.rs30
1 files changed, 17 insertions, 13 deletions
diff --git a/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs
index 97e0392ce1..407320e1d0 100644
--- a/crates/parser/src/grammar/expressions/atom.rs
+++ b/crates/parser/src/grammar/expressions/atom.rs
@@ -259,13 +259,7 @@ fn builtin_expr(p: &mut Parser<'_>) -> Option<CompletedMarker> {
type_(p);
p.expect(T![,]);
while !p.at(EOF) && !p.at(T![')']) {
- if p.at(IDENT) || p.at(INT_NUMBER) {
- name_ref_or_index(p);
- // } else if p.at(FLOAT_NUMBER) {
- // FIXME: needs float hack
- } else {
- p.err_and_bump("expected field name or number");
- }
+ name_ref_mod_path_or_index(p);
if !p.at(T![')']) {
p.expect(T![.]);
}
@@ -351,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();
@@ -405,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;
}
@@ -465,9 +469,9 @@ fn parse_clobber_abi(p: &mut Parser<'_>) {
fn parse_reg(p: &mut Parser<'_>) {
p.expect(T!['(']);
- if p.at(T![ident]) {
+ if p.at_ts(PATH_NAME_REF_KINDS) {
let m = p.start();
- name_ref(p);
+ name_ref_mod_path(p);
m.complete(p, ASM_REG_SPEC);
} else if p.at(T![string]) {
let m = p.start();