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(
26252625 const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c));
26262626 else_prong.expr = &(try transCreateNodeBreak(rp.c, "__switch")).base;
26272627 _ = 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", .{});
26282631 switch_scope.cases[switch_scope.case_index] = &else_prong.base;
26292632 switch_scope.case_index += 1;
26302633 }
......@@ -2666,6 +2669,9 @@ fn transCase(
26662669 const switch_prong = try transCreateNodeSwitchCase(rp.c, expr);
26672670 switch_prong.expr = &(try transCreateNodeBreak(rp.c, label)).base;
26682671 _ = 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", .{});
26692675 switch_scope.cases[switch_scope.case_index] = &switch_prong.base;
26702676 switch_scope.case_index += 1;
26712677
......@@ -2699,6 +2705,9 @@ fn transDefault(
26992705 const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c));
27002706 else_prong.expr = &(try transCreateNodeBreak(rp.c, label)).base;
27012707 _ = 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", .{});
27022711 switch_scope.cases[switch_scope.case_index] = &else_prong.base;
27032712 switch_scope.case_index += 1;
27042713
test/translate_c.zig+15
......@@ -3,6 +3,21 @@ const std = @import("std");
33const CrossTarget = std.zig.CrossTarget;
44
55pub 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
621 cases.add("correct semicolon after infixop",
722 \\#define __ferror_unlocked_body(_fp) (((_fp)->_flags & _IO_ERR_SEEN) != 0)
823 , &[_][]const u8{