authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-06-04 13:53:29+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-06-04 14:22:27+03:00
logc27a8bd6be57d7400a441d31717b61121044e298
treec1cffe24e645b72999b1715122df4359232b88fe
parentfd067fbe8b14c445ed764da15fff5163156126df
signature Commit is signed but in an unrecognized format.

translate-c: don't crash on complex switches


2 files changed, 24 insertions(+), 0 deletions(-)

src-self-hosted/translate_c.zig+9
...@@ -2625,6 +2625,9 @@ fn transSwitch(...@@ -2625,6 +2625,9 @@ fn transSwitch(
2625 const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c));2625 const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c));
2626 else_prong.expr = &(try transCreateNodeBreak(rp.c, "__switch")).base;2626 else_prong.expr = &(try transCreateNodeBreak(rp.c, "__switch")).base;
2627 _ = try appendToken(rp.c, .Comma, ",");2627 _ = try appendToken(rp.c, .Comma, ",");
2628
2629 if (switch_scope.case_index >= switch_scope.cases.len)
2630 return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), "TODO complex switch cases", .{});
2628 switch_scope.cases[switch_scope.case_index] = &else_prong.base;2631 switch_scope.cases[switch_scope.case_index] = &else_prong.base;
2629 switch_scope.case_index += 1;2632 switch_scope.case_index += 1;
2630 }2633 }
...@@ -2666,6 +2669,9 @@ fn transCase(...@@ -2666,6 +2669,9 @@ fn transCase(
2666 const switch_prong = try transCreateNodeSwitchCase(rp.c, expr);2669 const switch_prong = try transCreateNodeSwitchCase(rp.c, expr);
2667 switch_prong.expr = &(try transCreateNodeBreak(rp.c, label)).base;2670 switch_prong.expr = &(try transCreateNodeBreak(rp.c, label)).base;
2668 _ = try appendToken(rp.c, .Comma, ",");2671 _ = try appendToken(rp.c, .Comma, ",");
2672
2673 if (switch_scope.case_index >= switch_scope.cases.len)
2674 return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), "TODO complex switch cases", .{});
2669 switch_scope.cases[switch_scope.case_index] = &switch_prong.base;2675 switch_scope.cases[switch_scope.case_index] = &switch_prong.base;
2670 switch_scope.case_index += 1;2676 switch_scope.case_index += 1;
26712677
...@@ -2699,6 +2705,9 @@ fn transDefault(...@@ -2699,6 +2705,9 @@ fn transDefault(
2699 const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c));2705 const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c));
2700 else_prong.expr = &(try transCreateNodeBreak(rp.c, label)).base;2706 else_prong.expr = &(try transCreateNodeBreak(rp.c, label)).base;
2701 _ = try appendToken(rp.c, .Comma, ",");2707 _ = try appendToken(rp.c, .Comma, ",");
2708
2709 if (switch_scope.case_index >= switch_scope.cases.len)
2710 return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), "TODO complex switch cases", .{});
2702 switch_scope.cases[switch_scope.case_index] = &else_prong.base;2711 switch_scope.cases[switch_scope.case_index] = &else_prong.base;
2703 switch_scope.case_index += 1;2712 switch_scope.case_index += 1;
27042713
test/translate_c.zig+15
...@@ -3,6 +3,21 @@ const std = @import("std");...@@ -3,6 +3,21 @@ const std = @import("std");
3const CrossTarget = std.zig.CrossTarget;3const CrossTarget = std.zig.CrossTarget;
44
5pub fn addCases(cases: *tests.TranslateCContext) void {5pub fn addCases(cases: *tests.TranslateCContext) void {
6 cases.add("complex switch",
7 \\int main() {
8 \\ int i = 2;
9 \\ switch (i) {
10 \\ case 0: {
11 \\ case 2:{
12 \\ i += 2;}
13 \\ i += 1;
14 \\ }
15 \\ }
16 \\}
17 , &[_][]const u8{ // TODO properly translate this
18 \\pub const main = @compileError("unable to translate function");
19 });
20
6 cases.add("correct semicolon after infixop",21 cases.add("correct semicolon after infixop",
7 \\#define __ferror_unlocked_body(_fp) (((_fp)->_flags & _IO_ERR_SEEN) != 0)22 \\#define __ferror_unlocked_body(_fp) (((_fp)->_flags & _IO_ERR_SEEN) != 0)
8 , &[_][]const u8{23 , &[_][]const u8{