authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-06-05 10:41:56+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-06-05 10:41:56+03:00
log499df9680ceea203602ba1aebc475b047714dbf4
treeacf11a33f4a64db5c9e981008335f29011f3f3f1
parentf839d34baa8213048a1f073a38bf9b54af74711d
parentc27a8bd6be57d7400a441d31717b61121044e298
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #5531 from Vexu/translate-c

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{