fix for with null and T peer types and inferred result location type
See #2762
This commit is contained in:
parent
1b23c46138
commit
0a0c11685f
|
@ -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) {
|
||||
|
|
|
@ -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 });
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user