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

See #2762
This commit is contained in:
Andrew Kelley 2019-06-27 17:22:35 -04:00
parent 1b23c46138
commit 0a0c11685f
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
2 changed files with 19 additions and 3 deletions

View File

@ -6521,7 +6521,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo
loop_scope->is_comptime = is_comptime;
loop_scope->incoming_blocks = &incoming_blocks;
loop_scope->incoming_values = &incoming_values;
loop_scope->lval = lval;
loop_scope->lval = LValNone;
loop_scope->peer_parent = peer_parent;
// 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
}
ResultLocPeer *peer_result = create_peer_result(peer_parent);
peer_parent->peers.append(peer_result);
else_result = ir_gen_node_extra(irb, else_node, parent_scope, lval, &peer_result->base);
else_result = ir_gen_node_extra(irb, else_node, parent_scope, LValNone, &peer_result->base);
if (else_result == irb->codegen->invalid_instruction)
return else_result;
if (!instr_is_unreachable(else_result))
@ -6570,7 +6570,7 @@ static IrInstruction *ir_gen_for_expr(IrBuilder *irb, Scope *parent_scope, AstNo
IrInstruction *phi = ir_build_phi(irb, parent_scope, node, incoming_blocks.length,
incoming_blocks.items, incoming_values.items, peer_parent);
return ir_expr_wrap(irb, parent_scope, phi, result_loc);
return ir_lval_wrap(irb, parent_scope, phi, lval, result_loc);
}
static IrInstruction *ir_gen_bool_literal(IrBuilder *irb, Scope *scope, AstNode *node) {

View File

@ -126,3 +126,19 @@ test "2 break statements and an else" {
S.entry(true, false);
comptime S.entry(true, false);
}
test "for with null and T peer types and inferred result location type" {
const S = struct {
fn doTheTest(slice: []const u8) void {
if (for (slice) |item| {
if (item == 10) {
break item;
}
} else null) |v| {
@panic("fail");
}
}
};
S.doTheTest([_]u8{ 1, 2 });
comptime S.doTheTest([_]u8{ 1, 2 });
}