Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22201 from A4-Tacks/tuple-empty-expr
fix: handle empty expr in tuple expr
Chayim Refael Friedman 3 weeks ago
parent e914963 · parent c4064f8 · commit 73d482a
-rw-r--r--crates/parser/src/grammar/expressions/atom.rs21
-rw-r--r--crates/parser/test_data/generated/runner.rs4
-rw-r--r--crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast45
-rw-r--r--crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rs (renamed from crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rs)1
-rw-r--r--crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rast24
5 files changed, 60 insertions, 35 deletions
diff --git a/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs
index 3620a27c23..cabdd74b09 100644
--- a/crates/parser/src/grammar/expressions/atom.rs
+++ b/crates/parser/src/grammar/expressions/atom.rs
@@ -216,16 +216,19 @@ fn tuple_expr(p: &mut Parser<'_>) -> CompletedMarker {
let mut saw_comma = false;
let mut saw_expr = false;
- // test_err tuple_expr_leading_comma
- // fn foo() {
- // (,);
- // }
- if p.eat(T![,]) {
- p.error("expected expression");
- saw_comma = true;
- }
-
while !p.at(EOF) && !p.at(T![')']) {
+ // test_err tuple_expr_empty_expr
+ // fn foo() {
+ // (,);
+ // (a, , b);
+ // }
+ if p.current() == T![,] {
+ p.error("expected expression");
+ p.bump(T![,]);
+ saw_comma = true;
+ continue;
+ }
+
saw_expr = true;
// test tuple_attrs
diff --git a/crates/parser/test_data/generated/runner.rs b/crates/parser/test_data/generated/runner.rs
index ecb9ece67a..845119d922 100644
--- a/crates/parser/test_data/generated/runner.rs
+++ b/crates/parser/test_data/generated/runner.rs
@@ -958,8 +958,8 @@ mod err {
#[test]
fn top_level_let() { run_and_expect_errors("test_data/parser/inline/err/top_level_let.rs"); }
#[test]
- fn tuple_expr_leading_comma() {
- run_and_expect_errors("test_data/parser/inline/err/tuple_expr_leading_comma.rs");
+ fn tuple_expr_empty_expr() {
+ run_and_expect_errors("test_data/parser/inline/err/tuple_expr_empty_expr.rs");
}
#[test]
fn tuple_field_list_recovery() {
diff --git a/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast
new file mode 100644
index 0000000000..2ccd04c321
--- /dev/null
+++ b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rast
@@ -0,0 +1,45 @@
+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
+ TUPLE_EXPR
+ L_PAREN "("
+ COMMA ","
+ R_PAREN ")"
+ SEMICOLON ";"
+ WHITESPACE "\n "
+ EXPR_STMT
+ TUPLE_EXPR
+ L_PAREN "("
+ PATH_EXPR
+ PATH
+ PATH_SEGMENT
+ NAME_REF
+ IDENT "a"
+ COMMA ","
+ WHITESPACE " "
+ COMMA ","
+ WHITESPACE " "
+ PATH_EXPR
+ PATH
+ PATH_SEGMENT
+ NAME_REF
+ IDENT "b"
+ R_PAREN ")"
+ SEMICOLON ";"
+ WHITESPACE "\n"
+ R_CURLY "}"
+ WHITESPACE "\n"
+error 16: expected expression
+error 27: expected expression
diff --git a/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rs b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rs
index 12fab59a77..37f756ffa6 100644
--- a/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rs
+++ b/crates/parser/test_data/parser/inline/err/tuple_expr_empty_expr.rs
@@ -1,3 +1,4 @@
fn foo() {
(,);
+ (a, , b);
}
diff --git a/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rast b/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rast
deleted file mode 100644
index 3fbc0da400..0000000000
--- a/crates/parser/test_data/parser/inline/err/tuple_expr_leading_comma.rast
+++ /dev/null
@@ -1,24 +0,0 @@
-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
- TUPLE_EXPR
- L_PAREN "("
- COMMA ","
- R_PAREN ")"
- SEMICOLON ";"
- WHITESPACE "\n"
- R_CURLY "}"
- WHITESPACE "\n"
-error 17: expected expression