diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 29bcddc5f..3b1a91b28 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -2625,6 +2625,9 @@ fn transSwitch( const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c)); else_prong.expr = &(try transCreateNodeBreak(rp.c, "__switch")).base; _ = try appendToken(rp.c, .Comma, ","); + + if (switch_scope.case_index >= switch_scope.cases.len) + return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), "TODO complex switch cases", .{}); switch_scope.cases[switch_scope.case_index] = &else_prong.base; switch_scope.case_index += 1; } @@ -2666,6 +2669,9 @@ fn transCase( const switch_prong = try transCreateNodeSwitchCase(rp.c, expr); switch_prong.expr = &(try transCreateNodeBreak(rp.c, label)).base; _ = try appendToken(rp.c, .Comma, ","); + + if (switch_scope.case_index >= switch_scope.cases.len) + return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), "TODO complex switch cases", .{}); switch_scope.cases[switch_scope.case_index] = &switch_prong.base; switch_scope.case_index += 1; @@ -2699,6 +2705,9 @@ fn transDefault( const else_prong = try transCreateNodeSwitchCase(rp.c, try transCreateNodeSwitchElse(rp.c)); else_prong.expr = &(try transCreateNodeBreak(rp.c, label)).base; _ = try appendToken(rp.c, .Comma, ","); + + if (switch_scope.case_index >= switch_scope.cases.len) + return revertAndWarn(rp, error.UnsupportedTranslation, ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), "TODO complex switch cases", .{}); switch_scope.cases[switch_scope.case_index] = &else_prong.base; switch_scope.case_index += 1; diff --git a/test/translate_c.zig b/test/translate_c.zig index da97bc7cd..1c23afdb3 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -3,6 +3,21 @@ const std = @import("std"); const CrossTarget = std.zig.CrossTarget; pub fn addCases(cases: *tests.TranslateCContext) void { + cases.add("complex switch", + \\int main() { + \\ int i = 2; + \\ switch (i) { + \\ case 0: { + \\ case 2:{ + \\ i += 2;} + \\ i += 1; + \\ } + \\ } + \\} + , &[_][]const u8{ // TODO properly translate this + \\pub const main = @compileError("unable to translate function"); + }); + cases.add("correct semicolon after infixop", \\#define __ferror_unlocked_body(_fp) (((_fp)->_flags & _IO_ERR_SEEN) != 0) , &[_][]const u8{