about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonas Schievink <jonas.schievink@ferrous-systems.com>2022-12-12 12:57:29 +0100
committerJonas Schievink <jonas.schievink@ferrous-systems.com>2022-12-12 12:57:29 +0100
commited48bd8b9ddef0f57e54de2deb46c41d6b6ec4e3 (patch)
tree3dfaa7b23434f89a7eb162f5bd5b12cc9886dbf9
parent21e61bee8b74e93f14205f4a6c316db08f811e38 (diff)
downloadrust-ed48bd8b9ddef0f57e54de2deb46c41d6b6ec4e3.tar.gz
rust-ed48bd8b9ddef0f57e54de2deb46c41d6b6ec4e3.zip
Fix parsing of `_ = x` in closure body
-rw-r--r--crates/parser/src/grammar/expressions.rs2
-rw-r--r--crates/parser/src/grammar/expressions/atom.rs2
-rw-r--r--crates/parser/test_data/parser/inline/ok/0203_closure_body_underscore_assignment.rast32
-rw-r--r--crates/parser/test_data/parser/inline/ok/0203_closure_body_underscore_assignment.rs1
4 files changed, 36 insertions, 1 deletions
diff --git a/crates/parser/src/grammar/expressions.rs b/crates/parser/src/grammar/expressions.rs
index dcaceade652..8932330b825 100644
--- a/crates/parser/src/grammar/expressions.rs
+++ b/crates/parser/src/grammar/expressions.rs
@@ -288,7 +288,7 @@ fn expr_bp(
 }
 
 const LHS_FIRST: TokenSet =
-    atom::ATOM_EXPR_FIRST.union(TokenSet::new(&[T![&], T![*], T![!], T![.], T![-]]));
+    atom::ATOM_EXPR_FIRST.union(TokenSet::new(&[T![&], T![*], T![!], T![.], T![-], T![_]]));
 
 fn lhs(p: &mut Parser<'_>, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> {
     let m;
diff --git a/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs
index 99f42a26623..81027a7bf33 100644
--- a/crates/parser/src/grammar/expressions/atom.rs
+++ b/crates/parser/src/grammar/expressions/atom.rs
@@ -278,6 +278,8 @@ fn closure_expr(p: &mut Parser<'_>) -> CompletedMarker {
         // fn main() { || -> i32 { 92 }(); }
         block_expr(p);
     } else if p.at_ts(EXPR_FIRST) {
+        // test closure_body_underscore_assignment
+        // fn main() { || _ = 0; }
         expr(p);
     } else {
         p.error("expected expression");
diff --git a/crates/parser/test_data/parser/inline/ok/0203_closure_body_underscore_assignment.rast b/crates/parser/test_data/parser/inline/ok/0203_closure_body_underscore_assignment.rast
new file mode 100644
index 00000000000..8970922c977
--- /dev/null
+++ b/crates/parser/test_data/parser/inline/ok/0203_closure_body_underscore_assignment.rast
@@ -0,0 +1,32 @@
+SOURCE_FILE
+  FN
+    FN_KW "fn"
+    WHITESPACE " "
+    NAME
+      IDENT "main"
+    PARAM_LIST
+      L_PAREN "("
+      R_PAREN ")"
+    WHITESPACE " "
+    BLOCK_EXPR
+      STMT_LIST
+        L_CURLY "{"
+        WHITESPACE " "
+        EXPR_STMT
+          CLOSURE_EXPR
+            PARAM_LIST
+              PIPE "|"
+              PIPE "|"
+            WHITESPACE " "
+            BIN_EXPR
+              UNDERSCORE_EXPR
+                UNDERSCORE "_"
+              WHITESPACE " "
+              EQ "="
+              WHITESPACE " "
+              LITERAL
+                INT_NUMBER "0"
+          SEMICOLON ";"
+        WHITESPACE " "
+        R_CURLY "}"
+  WHITESPACE "\n"
diff --git a/crates/parser/test_data/parser/inline/ok/0203_closure_body_underscore_assignment.rs b/crates/parser/test_data/parser/inline/ok/0203_closure_body_underscore_assignment.rs
new file mode 100644
index 00000000000..9a34b63d29c
--- /dev/null
+++ b/crates/parser/test_data/parser/inline/ok/0203_closure_body_underscore_assignment.rs
@@ -0,0 +1 @@
+fn main() { || _ = 0; }