authorgravatar for raulgrell@gmail.comRaul Leal <raulgrell@gmail.com> 2018-08-22 18:12:08+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-08-22 13:12:08-04:00
log87b10400c2a2d39f33e361cf4d7fd8caee7e519b
tree318c5b472ebab1a255be891714c89567b943cdc9
parent3d780cf2ef8391b6b48124f599858ee99ddc4cdc

allow implicit cast from *[N]T to ?[*]T (#1398)

* allow implicit cast from *[N]T to ?[*]T

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

src/ir.cpp+13
......@@ -10697,6 +10697,19 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst
1069710697 return ira->codegen->invalid_instruction;
1069810698
1069910699 return cast2;
10700 } else if (
10701 wanted_child_type->id == TypeTableEntryIdPointer &&
10702 wanted_child_type->data.pointer.ptr_len == PtrLenUnknown &&
10703 actual_type->id == TypeTableEntryIdPointer &&
10704 actual_type->data.pointer.ptr_len == PtrLenSingle &&
10705 actual_type->data.pointer.child_type->id == TypeTableEntryIdArray &&
10706 actual_type->data.pointer.alignment >= wanted_child_type->data.pointer.alignment &&
10707 types_match_const_cast_only(ira, wanted_child_type->data.pointer.child_type,
10708 actual_type->data.pointer.child_type->data.array.child_type, source_node,
10709 !wanted_child_type->data.pointer.is_const).id == ConstCastResultIdOk)
10710 {
10711 IrInstruction *cast1 = ir_resolve_ptr_of_array_to_slice(ira, source_instr, value, wanted_child_type);
10712 return ir_analyze_maybe_wrap(ira, source_instr, cast1, wanted_type);
1070010713 }
1070110714 }
1070210715
test/cases/cast.zig+11
......@@ -485,3 +485,14 @@ fn MakeType(comptime T: type) type {
485485 }
486486 };
487487}
488
489test "implicit cast from *[N]T to ?[*]T" {
490 var x: ?[*]u16 = null;
491 var y: [4]u16 = [4]u16 {0, 1, 2, 3};
492
493 x = &y;
494 assert(std.mem.eql(u16, x.?[0..4], y[0..4]));
495 x.?[0] = 8;
496 y[3] = 6;
497 assert(std.mem.eql(u16, x.?[0..4], y[0..4]));
498}
\ No newline at end of file