authorgravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2021-06-06 17:33:57-07:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-06-07 15:51:42+03:00
logfa6546ba743fe145ad65d9ca76fe9e9e01d05056
tree947d63ce806687cef2ca59b3af34e3dacf5a6147
parentfc8791c133c14fe969b9056d8f0e337094ce1461

translate-c: properly handle enums used as boolean expressions


3 files changed, 14 insertions(+), 2 deletions(-)

src/translate_c.zig+2-1
...@@ -1931,7 +1931,8 @@ fn finishBoolExpr(...@@ -1931,7 +1931,8 @@ fn finishBoolExpr(
1931 },1931 },
1932 .Enum => {1932 .Enum => {
1933 // node != 01933 // node != 0
1934 return Tag.not_equal.create(c.arena, .{ .lhs = node, .rhs = Tag.zero_literal.init() });1934 const int_val = try Tag.enum_to_int.create(c.arena, node);
1935 return Tag.not_equal.create(c.arena, .{ .lhs = int_val, .rhs = Tag.zero_literal.init() });
1935 },1936 },
1936 .Elaborated => {1937 .Elaborated => {
1937 const elaborated_ty = @ptrCast(*const clang.ElaboratedType, ty);1938 const elaborated_ty = @ptrCast(*const clang.ElaboratedType, ty);
test/run_translated_c.zig+11
...@@ -1508,4 +1508,15 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {...@@ -1508,4 +1508,15 @@ pub fn addCases(cases: *tests.RunTranslatedCContext) void {
1508 \\ return 0;1508 \\ return 0;
1509 \\}1509 \\}
1510 , "");1510 , "");
1511
1512 cases.add("enum used as boolean expression",
1513 \\#include <stdlib.h>
1514 \\enum FOO {BAR, BAZ};
1515 \\int main(void) {
1516 \\ enum FOO x = BAR;
1517 \\ if (x) abort();
1518 \\ if (!BAZ) abort();
1519 \\ return 0;
1520 \\}
1521 , "");
1511}1522}
test/translate_c.zig+1-1
...@@ -2668,7 +2668,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2668,7 +2668,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2668 \\ if (a != 0) return 0;2668 \\ if (a != 0) return 0;
2669 \\ if (b != 0) return 1;2669 \\ if (b != 0) return 1;
2670 \\ if (c != null) return 2;2670 \\ if (c != null) return 2;
2671 \\ if (d != 0) return 3;2671 \\ if (@enumToInt(d) != 0) return 3;
2672 \\ return 4;2672 \\ return 4;
2673 \\}2673 \\}
2674 });2674 });