diff --git a/src/translate_c.cpp b/src/translate_c.cpp index 3c9ff6e2648609ce91e5a380b6ecfc9b78a73518..d56673d39aae8bec693889b7039be560c221bb1f 100644 --- a/src/translate_c.cpp +++ b/src/translate_c.cpp @@ -2344,7 +2344,7 @@ static AstNode *trans_switch_stmt(Context *c, TransScope *parent_scope, const Sw if (!switch_scope->found_default && !stmt->isAllEnumCasesCovered()) { AstNode *prong_node = trans_create_node(c, NodeTypeSwitchProng); - prong_node->data.switch_prong.expr = trans_create_node(c, NodeTypeBreak); + prong_node->data.switch_prong.expr = trans_create_node_goto(c, end_label_name); switch_scope->switch_node->data.switch_expr.prongs.append(prong_node); } diff --git a/test/translate_c.zig b/test/translate_c.zig index 4323a867f86ae5d21fa45547544a92e883198550..4d00307d219522f3df3bd7a22f63f7613ccd7e18 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -1042,6 +1042,44 @@ pub fn addCases(cases: &tests.TranslateCContext) { \\ return x + 13; \\} ); + + cases.add("switch statement with no default", + \\int foo(int x) { + \\ switch (x) { + \\ case 1: + \\ x += 1; + \\ case 2: + \\ break; + \\ case 3: + \\ case 4: + \\ return x + 1; + \\ } + \\ return x + 13; + \\} + , + \\fn foo(_arg_x: c_int) -> c_int { + \\ var x = _arg_x; + \\ { + \\ switch (x) { + \\ 1 => goto case_0, + \\ 2 => goto case_1, + \\ 3 => goto case_2, + \\ 4 => goto case_3, + \\ else => goto end, + \\ }; + \\ case_0: + \\ x += 1; + \\ case_1: + \\ goto end; + \\ case_2: + \\ case_3: + \\ return x + 1; + \\ goto end; + \\ end: + \\ }; + \\ return x + 13; + \\} + ); }