Commit 57cd074959

Josh Wolfe <thejoshwolfe@gmail.com>
2017-11-14 03:59:32
parsec supports C comma operator
1 parent 1f28fcd
Changed files (2)
src/parsec.cpp
@@ -1099,8 +1099,17 @@ static AstNode *trans_binary_operator(Context *c, bool result_used, AstNode *blo
             emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_OrAssign");
             return nullptr;
         case BO_Comma:
-            emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_Comma");
-            return nullptr;
+            {
+                block = trans_create_node(c, NodeTypeBlock);
+                AstNode *lhs = trans_expr(c, false, block, stmt->getLHS(), TransRValue);
+                if (lhs == nullptr) return nullptr;
+                block->data.block.statements.append(maybe_suppress_result(c, false, lhs));
+                AstNode *rhs = trans_expr(c, result_used, block, stmt->getRHS(), TransRValue);
+                if (rhs == nullptr) return nullptr;
+                block->data.block.statements.append(maybe_suppress_result(c, result_used, rhs));
+                block->data.block.last_statement_is_result_expression = true;
+                return block;
+            }
     }
 
     zig_unreachable();
test/parsec.zig
@@ -606,8 +606,20 @@ pub fn addCases(cases: &tests.ParseCContext) {
         \\    return null;
         \\}
     );
-}
 
+    cases.addC("comma operator",
+        \\int foo(void) {
+        \\    return 1, 2;
+        \\}
+    ,
+        \\export fn foo() -> c_int {
+        \\    return {
+        \\        _ = 1;
+        \\        2
+        \\    };
+        \\}
+    );
+}