zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 155029b709ac3056dc2e6fb620fb4a99d4252c7e (tree)
parent e72f45475d05fb446e48d3e34e6c8e367916bd50
Author: Vexu <git@vexu.eu>
Date:   Thu, 30 Apr 2020 18:28:38 +0300

Merge pull request #5223 from iansimonson/translate_c_bool_to_int

Translate-C convert bools to int in complex expressions
Diffstat:
Msrc-self-hosted/translate_c.zig | 17++++++++++++++++-
Mtest/run_translated_c.zig | 48++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 1 deletion(-)

diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig @@ -1293,7 +1293,22 @@ fn transBinaryOperator( } const rhs_node = try transExpr(rp, scope, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value); - return transCreateNodeInfixOp(rp, scope, lhs_node, op_id, op_token, rhs_node, result_used, true); + + const lhs = if (isBoolRes(lhs_node)) init: { + const cast_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt"); + try cast_node.params.push(lhs_node); + cast_node.rparen_token = try appendToken(rp.c, .RParen, ")"); + break :init &cast_node.base; + } else lhs_node; + + const rhs = if (isBoolRes(rhs_node)) init: { + const cast_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt"); + try cast_node.params.push(rhs_node); + cast_node.rparen_token = try appendToken(rp.c, .RParen, ")"); + break :init &cast_node.base; + } else rhs_node; + + return transCreateNodeInfixOp(rp, scope, lhs, op_id, op_token, rhs, result_used, true); } fn transCompoundStmtInline( diff --git a/test/run_translated_c.zig b/test/run_translated_c.zig @@ -195,4 +195,52 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void { \\ return 0; \\} , ""); + + cases.add("case boolean expression converted to int", + \\#include <stdlib.h> + \\int main(int argc, char **argv) { + \\ int value = 1 + 2 * 3 + 4 * 5 + 6 << 7 | 8 == 9; + \\ if (value != 4224) abort(); + \\ return 0; + \\} + , ""); + + cases.add("case boolean expression on left converted to int", + \\#include <stdlib.h> + \\int main(int argc, char **argv) { + \\ int value = 8 == 9 | 1 + 2 * 3 + 4 * 5 + 6 << 7; + \\ if (value != 4224) abort(); + \\ return 0; + \\} + , ""); + + cases.add("case boolean and operator+ converts bool to int", + \\#include <stdlib.h> + \\int main(int argc, char **argv) { + \\ int value = (8 == 9) + 3; + \\ int value2 = 3 + (8 == 9); + \\ if (value != value2) abort(); + \\ return 0; + \\} + , ""); + + cases.add("case boolean and operator<", + \\#include <stdlib.h> + \\int main(int argc, char **argv) { + \\ int value = (8 == 9) < 3; + \\ if (value == 0) abort(); + \\ return 0; + \\} + , ""); + + cases.add("case boolean and operator*", + \\#include <stdlib.h> + \\int main(int argc, char **argv) { + \\ int value = (8 == 9) * 3; + \\ int value2 = 3 * (9 == 9); + \\ if (value != 0) abort(); + \\ if (value2 == 0) abort(); + \\ return 0; + \\} + , ""); }