From 2ae789d27cec716c104a9e817a66f59b2ed53f47 Mon Sep 17 00:00:00 2001 From: Josh Wolfe Date: Wed, 20 Sep 2017 22:04:51 -0700 Subject: [PATCH] bitwise binary operators --- src/parsec.cpp | 12 ++++-------- test/parsec.zig | 10 ++++++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/parsec.cpp b/src/parsec.cpp index 0c49cf30ef..e074c3138f 100644 --- a/src/parsec.cpp +++ b/src/parsec.cpp @@ -980,14 +980,11 @@ static AstNode *trans_binary_operator(Context *c, bool result_used, AstNode *blo case BO_NE: return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeCmpNotEq, stmt->getRHS()); case BO_And: - emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_And"); - return nullptr; + return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeBinAnd, stmt->getRHS()); case BO_Xor: - emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_Xor"); - return nullptr; + return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeBinXor, stmt->getRHS()); case BO_Or: - emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_Or"); - return nullptr; + return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeBinOr, stmt->getRHS()); case BO_LAnd: return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeBoolAnd, stmt->getRHS()); case BO_LOr: @@ -2107,8 +2104,7 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s emit_warning(c, stmt->getLocStart(), "TODO handle C PackExpansionExprClass"); return nullptr; case Stmt::ParenExprClass: - emit_warning(c, stmt->getLocStart(), "TODO handle C ParenExprClass"); - return nullptr; + return trans_expr(c, result_used, block, ((ParenExpr*)stmt)->getSubExpr(), lrvalue); case Stmt::ParenListExprClass: emit_warning(c, stmt->getLocStart(), "TODO handle C ParenListExprClass"); return nullptr; diff --git a/test/parsec.zig b/test/parsec.zig index 0027903f36..7bae7ce259 100644 --- a/test/parsec.zig +++ b/test/parsec.zig @@ -389,6 +389,16 @@ pub fn addCases(cases: &tests.ParseCContext) { \\} ); + cases.add("bitwise binary operators", + \\int max(int a, int b) { + \\ return (a & b) ^ (a | b); + \\} + , + \\export fn max(a: c_int, b: c_int) -> c_int { + \\ return (a & b) ^ (a | b); + \\} + ); + cases.add("logical and, logical or", \\int max(int a, int b) { \\ if (a < b || a == b)