From 3e8fd245473a6e532fa4f9b42c51bd8257c15b3c Mon Sep 17 00:00:00 2001 From: Mason Remaley Date: Mon, 27 Nov 2017 21:00:05 -0500 Subject: [PATCH] Implements translation for the prefix not operator (#628) --- src/translate_c.cpp | 9 +++++++-- test/translate_c.zig | 10 ++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/translate_c.cpp b/src/translate_c.cpp index b123fcb56e..23c3ff9821 100644 --- a/src/translate_c.cpp +++ b/src/translate_c.cpp @@ -1875,8 +1875,13 @@ static AstNode *trans_unary_operator(Context *c, ResultUsed result_used, TransSc } } case UO_Not: - emit_warning(c, stmt->getLocStart(), "TODO handle C translation UO_Not"); - return nullptr; + { + Expr *op_expr = stmt->getSubExpr(); + AstNode *sub_node = trans_expr(c, ResultUsedYes, scope, op_expr, TransRValue); + if (sub_node == nullptr) + return nullptr; + return trans_create_node_prefix_op(c, PrefixOpBinNot, sub_node); + } case UO_LNot: emit_warning(c, stmt->getLocStart(), "TODO handle C translation UO_LNot"); return nullptr; diff --git a/test/translate_c.zig b/test/translate_c.zig index 7bae341a67..198d813af1 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -1114,4 +1114,14 @@ pub fn addCases(cases: &tests.TranslateCContext) { \\ return @ptrCast(?&f32, a); \\} ); + + cases.add("bin not", + \\int foo(int x) { + \\ return ~x; + \\} + , + \\pub fn foo(x: c_int) -> c_int { + \\ return ~x; + \\} + ); }