authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-04-30 18:28:38+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-04-30 18:28:38+03:00
log155029b709ac3056dc2e6fb620fb4a99d4252c7e
treeeb334fb58ada65369c94e06e57ef2b914e9d41bf
parente72f45475d05fb446e48d3e34e6c8e367916bd50
parenta2c3ebb75615ea47052eeb5a99b9b6881bc71d11
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #5223 from iansimonson/translate_c_bool_to_int

Translate-C convert bools to int in complex expressions

2 files changed, 64 insertions(+), 1 deletions(-)

src-self-hosted/translate_c.zig+16-1
...@@ -1293,7 +1293,22 @@ fn transBinaryOperator(...@@ -1293,7 +1293,22 @@ fn transBinaryOperator(
1293 }1293 }
12941294
1295 const rhs_node = try transExpr(rp, scope, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);1295 const rhs_node = try transExpr(rp, scope, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);
1296 return transCreateNodeInfixOp(rp, scope, lhs_node, op_id, op_token, rhs_node, result_used, true);1296
1297 const lhs = if (isBoolRes(lhs_node)) init: {
1298 const cast_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt");
1299 try cast_node.params.push(lhs_node);
1300 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1301 break :init &cast_node.base;
1302 } else lhs_node;
1303
1304 const rhs = if (isBoolRes(rhs_node)) init: {
1305 const cast_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt");
1306 try cast_node.params.push(rhs_node);
1307 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
1308 break :init &cast_node.base;
1309 } else rhs_node;
1310
1311 return transCreateNodeInfixOp(rp, scope, lhs, op_id, op_token, rhs, result_used, true);
1297}1312}
12981313
1299fn transCompoundStmtInline(1314fn transCompoundStmtInline(
test/run_translated_c.zig+48
...@@ -195,4 +195,52 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {...@@ -195,4 +195,52 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
195 \\ return 0;195 \\ return 0;
196 \\}196 \\}
197 , "");197 , "");
198
199 cases.add("case boolean expression converted to int",
200 \\#include <stdlib.h>
201 \\int main(int argc, char **argv) {
202 \\ int value = 1 + 2 * 3 + 4 * 5 + 6 << 7 | 8 == 9;
203 \\ if (value != 4224) abort();
204 \\ return 0;
205 \\}
206 , "");
207
208 cases.add("case boolean expression on left converted to int",
209 \\#include <stdlib.h>
210 \\int main(int argc, char **argv) {
211 \\ int value = 8 == 9 | 1 + 2 * 3 + 4 * 5 + 6 << 7;
212 \\ if (value != 4224) abort();
213 \\ return 0;
214 \\}
215 , "");
216
217 cases.add("case boolean and operator+ converts bool to int",
218 \\#include <stdlib.h>
219 \\int main(int argc, char **argv) {
220 \\ int value = (8 == 9) + 3;
221 \\ int value2 = 3 + (8 == 9);
222 \\ if (value != value2) abort();
223 \\ return 0;
224 \\}
225 , "");
226
227 cases.add("case boolean and operator<",
228 \\#include <stdlib.h>
229 \\int main(int argc, char **argv) {
230 \\ int value = (8 == 9) < 3;
231 \\ if (value == 0) abort();
232 \\ return 0;
233 \\}
234 , "");
235
236 cases.add("case boolean and operator*",
237 \\#include <stdlib.h>
238 \\int main(int argc, char **argv) {
239 \\ int value = (8 == 9) * 3;
240 \\ int value2 = 3 * (9 == 9);
241 \\ if (value != 0) abort();
242 \\ if (value2 == 0) abort();
243 \\ return 0;
244 \\}
245 , "");
198}246}