From 4c8443d96db4a441b393ea0c3c8d76a7493f46d0 Mon Sep 17 00:00:00 2001 From: Josh Wolfe Date: Wed, 20 Sep 2017 21:37:56 -0700 Subject: [PATCH] logical and, logical or --- src/ast_render.cpp | 4 ++-- src/parsec.cpp | 10 ++++------ test/parsec.zig | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/ast_render.cpp b/src/ast_render.cpp index 1ac9d8de79..a68e1efc58 100644 --- a/src/ast_render.cpp +++ b/src/ast_render.cpp @@ -14,8 +14,8 @@ static const char *bin_op_str(BinOpType bin_op) { switch (bin_op) { case BinOpTypeInvalid: return "(invalid)"; - case BinOpTypeBoolOr: return "||"; - case BinOpTypeBoolAnd: return "&&"; + case BinOpTypeBoolOr: return "or"; + case BinOpTypeBoolAnd: return "and"; case BinOpTypeCmpEq: return "=="; case BinOpTypeCmpNotEq: return "!="; case BinOpTypeCmpLessThan: return "<"; diff --git a/src/parsec.cpp b/src/parsec.cpp index da1d9dd3c4..342b519b19 100644 --- a/src/parsec.cpp +++ b/src/parsec.cpp @@ -976,8 +976,7 @@ static AstNode *trans_binary_operator(Context *c, bool result_used, AstNode *blo case BO_GE: return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeCmpGreaterOrEq, stmt->getRHS()); case BO_EQ: - emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_EQ"); - return nullptr; + return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeCmpEq, stmt->getRHS()); case BO_NE: emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_NE"); return nullptr; @@ -991,11 +990,10 @@ static AstNode *trans_binary_operator(Context *c, bool result_used, AstNode *blo emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_Or"); return nullptr; case BO_LAnd: - emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_LAnd"); - return nullptr; + return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeBoolAnd, stmt->getRHS()); case BO_LOr: - emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_LOr"); - return nullptr; + // TODO: int vs bool + return trans_create_bin_op(c, block, stmt->getLHS(), BinOpTypeBoolOr, stmt->getRHS()); case BO_Assign: (void)result_used; emit_warning(c, stmt->getLocStart(), "TODO handle more C binary operators: BO_Assign"); diff --git a/test/parsec.zig b/test/parsec.zig index b4f91a984f..a30cb067b1 100644 --- a/test/parsec.zig +++ b/test/parsec.zig @@ -373,6 +373,22 @@ pub fn addCases(cases: &tests.ParseCContext) { \\} ); + cases.add("logical and, logical or", + \\int max(int a, int b) { + \\ if (a < b || a == b) + \\ return b; + \\ if (a >= b && a == b) + \\ return a; + \\ return a; + \\} + , + \\export fn max(a: c_int, b: c_int) -> c_int { + \\ if ((a < b) or (a == b)) return b; + \\ if ((a >= b) and (a == b)) return a; + \\ return a; + \\} + ); + cases.add("shift right assign with a fixed size type", \\#include \\int log2(uint32_t a) {