authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-23 18:06:33-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-23 18:06:33-04:00
log15bf0c1541479870dff1f8d64a3746c337f901ef
tree18528ec7e1dfe228ff372ab9e7958db72faebef3
parent89a4c373d3756baeac9d2780b1249ada37961d16

fix interaction between defer and labeled break

closes #830

2 files changed, 14 insertions(+), 0 deletions(-)

src/ir.cpp+3
......@@ -3147,6 +3147,9 @@ static IrInstruction *ir_gen_block(IrBuilder *irb, Scope *parent_scope, AstNode
31473147 if (block_node->data.block.name == nullptr || incoming_blocks.length == 0) {
31483148 return noreturn_return_value;
31493149 }
3150
3151 ir_set_cursor_at_end_and_append_block(irb, scope_block->end_block);
3152 return ir_build_phi(irb, parent_scope, block_node, incoming_blocks.length, incoming_blocks.items, incoming_values.items);
31503153 } else {
31513154 incoming_blocks.append(irb->current_basic_block);
31523155 incoming_values.append(ir_mark_gen(ir_build_const_void(irb, parent_scope, block_node)));
test/cases/defer.zig+11
......@@ -41,3 +41,14 @@ fn testBreakContInDefer(x: usize) void {
4141 assert(i == 5);
4242 }
4343}
44
45test "defer and labeled break" {
46 var i = usize(0);
47
48 blk: {
49 defer i += 1;
50 break :blk;
51 }
52
53 assert(i == 1);
54}