authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-27 17:22:35-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-27 17:22:35-04:00
log0a0c11685fd8faf73392d88dbdee7c744cc83386
tree73ef6a0fc9f6d183f70bec3750182665e157a909
parent1b23c461380dea2a2b04eb234652a705f01f05a7
signaturelock-open Commit is signed but in an unrecognized format.

fix for with null and T peer types and inferred result location type

See #2762

2 files changed, 19 insertions(+), 3 deletions(-)

src/ir.cpp+3-3
...@@ -6521,7 +6521,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo...@@ -6521,7 +6521,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo
6521 loop_scope->is_comptime = is_comptime;6521 loop_scope->is_comptime = is_comptime;
6522 loop_scope->incoming_blocks = &incoming_blocks;6522 loop_scope->incoming_blocks = &incoming_blocks;
6523 loop_scope->incoming_values = &incoming_values;6523 loop_scope->incoming_values = &incoming_values;
6524 loop_scope->lval = lval;6524 loop_scope->lval = LValNone;
6525 loop_scope->peer_parent = peer_parent;6525 loop_scope->peer_parent = peer_parent;
65266526
6527 // Note the body block of the loop is not the place that lval and result_loc are used -6527 // Note the body block of the loop is not the place that lval and result_loc are used -
...@@ -6548,7 +6548,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo...@@ -6548,7 +6548,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo
6548 }6548 }
6549 ResultLocPeer *peer_result = create_peer_result(peer_parent);6549 ResultLocPeer *peer_result = create_peer_result(peer_parent);
6550 peer_parent->peers.append(peer_result);6550 peer_parent->peers.append(peer_result);
6551 else_result = ir_gen_node_extra(irb, else_node, parent_scope, lval, &peer_result->base);6551 else_result = ir_gen_node_extra(irb, else_node, parent_scope, LValNone, &peer_result->base);
6552 if (else_result == irb->codegen->invalid_instruction)6552 if (else_result == irb->codegen->invalid_instruction)
6553 return else_result;6553 return else_result;
6554 if (!instr_is_unreachable(else_result))6554 if (!instr_is_unreachable(else_result))
...@@ -6570,7 +6570,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo...@@ -6570,7 +6570,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo
65706570
6571 IrInstruction *phi = ir_build_phi(irb, parent_scope, node, incoming_blocks.length,6571 IrInstruction *phi = ir_build_phi(irb, parent_scope, node, incoming_blocks.length,
6572 incoming_blocks.items, incoming_values.items, peer_parent);6572 incoming_blocks.items, incoming_values.items, peer_parent);
6573 return ir_expr_wrap(irb, parent_scope, phi, result_loc);6573 return ir_lval_wrap(irb, parent_scope, phi, lval, result_loc);
6574}6574}
65756575
6576static IrInstruction *ir_gen_bool_literal(IrBuilder *irb, Scope *scope, AstNode *node) {6576static IrInstruction *ir_gen_bool_literal(IrBuilder *irb, Scope *scope, AstNode *node) {
test/stage1/behavior/for.zig+16
...@@ -126,3 +126,19 @@ test "2 break statements and an else" {...@@ -126,3 +126,19 @@ test "2 break statements and an else" {
126 S.entry(true, false);126 S.entry(true, false);
127 comptime S.entry(true, false);127 comptime S.entry(true, false);
128}128}
129
130test "for with null and T peer types and inferred result location type" {
131 const S = struct {
132 fn doTheTest(slice: []const u8) void {
133 if (for (slice) |item| {
134 if (item == 10) {
135 break item;
136 }
137 } else null) |v| {
138 @panic("fail");
139 }
140 }
141 };
142 S.doTheTest([_]u8{ 1, 2 });
143 comptime S.doTheTest([_]u8{ 1, 2 });
144}