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...@@ -3147,6 +3147,9 @@ static IrInstruction *ir_gen_block(IrBuilder *irb, Scope *parent_scope, AstNode
3147 if (block_node->data.block.name == nullptr || incoming_blocks.length == 0) {3147 if (block_node->data.block.name == nullptr || incoming_blocks.length == 0) {
3148 return noreturn_return_value;3148 return noreturn_return_value;
3149 }3149 }
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);
3150 } else {3153 } else {
3151 incoming_blocks.append(irb->current_basic_block);3154 incoming_blocks.append(irb->current_basic_block);
3152 incoming_values.append(ir_mark_gen(ir_build_const_void(irb, parent_scope, block_node)));3155 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 {...@@ -41,3 +41,14 @@ fn testBreakContInDefer(x: usize) void {
41 assert(i == 5);41 assert(i == 5);
42 }42 }
43}43}
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}