aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-05-23 17:58:35 -0400
committerAndrew Kelley <andrew@ziglang.org>2020-05-23 17:58:35 -0400
commit88f5e3a60d6ea528f27935c63aaf3312d736cdbe (patch)
treeaba89a600b258e0869afda1877929cf15d87ccb3
parentf67b8c68a0e8ddc60bcfc928d0781005d129526a (diff)
downloadzig-88f5e3a60d6ea528f27935c63aaf3312d736cdbe.tar.gz
zig-88f5e3a60d6ea528f27935c63aaf3312d736cdbe.zip
translate-c: fix regression in switch statement
-rw-r--r--src-self-hosted/translate_c.zig23
1 files changed, 10 insertions, 13 deletions
diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig
index d80449d87a..a4e16c83ff 100644
--- a/src-self-hosted/translate_c.zig
+++ b/src-self-hosted/translate_c.zig
@@ -2554,9 +2554,8 @@ fn transForLoop(
fn getSwitchCaseCount(stmt: *const ZigClangSwitchStmt) usize {
const body = ZigClangSwitchStmt_getBody(stmt);
- assert(ZigClangStmt_getStmtClass(body) == .StmtExprClass);
- const stmt_expr = @ptrCast(*const ZigClangStmtExpr, body);
- const comp = ZigClangStmtExpr_getSubStmt(stmt_expr);
+ assert(ZigClangStmt_getStmtClass(body) == .CompoundStmtClass);
+ const comp = @ptrCast(*const ZigClangCompoundStmt, body);
// TODO https://github.com/ziglang/zig/issues/1738
// return ZigClangCompoundStmt_body_end(comp) - ZigClangCompoundStmt_body_begin(comp);
const start_addr = @ptrToInt(ZigClangCompoundStmt_body_begin(comp));
@@ -2614,19 +2613,17 @@ fn transSwitch(
switch_scope.pending_block = try Scope.Block.init(rp.c, scope, null);
try switch_scope.pending_block.statements.append(&switch_node.base);
- _ = try transStmt(rp, &block_scope.base, ZigClangSwitchStmt_getBody(stmt), .unused, .r_value);
+ const last = try transStmt(rp, &block_scope.base, ZigClangSwitchStmt_getBody(stmt), .unused, .r_value);
_ = try appendToken(rp.c, .Semicolon, ";");
// take all pending statements
- try switch_scope.pending_block.statements.appendSlice(block_scope.statements.items);
- // TODO delete the following commented out code
- //const last_block_stmts = last.cast(ast.Node.Block).?.statements();
- //switch_scope.pending_block.statements.ensureCapacity(
- // switch_scope.pending_block.statements.items.len + last_block_stmts.len,
- //);
- //for (last_block_stmts) |n| {
- // switch_scope.pending_block.statements.appendAssumeCapacity(n);
- //}
+ const last_block_stmts = last.cast(ast.Node.Block).?.statements();
+ try switch_scope.pending_block.statements.ensureCapacity(
+ switch_scope.pending_block.statements.items.len + last_block_stmts.len,
+ );
+ for (last_block_stmts) |n| {
+ switch_scope.pending_block.statements.appendAssumeCapacity(n);
+ }
switch_scope.pending_block.label = try appendIdentifier(rp.c, "__switch");
_ = try appendToken(rp.c, .Colon, ":");