authorgravatar for 9532786+elucent@users.noreply.github.comelucent <9532786+elucent@users.noreply.github.com> 2020-04-21 02:10:50-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-21 18:09:03-04:00
log48dc3b6fe9e16e9a5dc4b586d260e19bdbd682a1
tree48a3251cb7e4e5a3f0aff5d5e827eeddb059c53d
parent412aac8a70b2c38cb31f6ab8e76f9fbb774e90bc

Added peer type resolution for [*]T and *[N]T.


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

src/ir.cpp+31
...@@ -11962,6 +11962,7 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT...@@ -11962,6 +11962,7 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
11962 bool any_are_null = (prev_inst->value->type->id == ZigTypeIdNull);11962 bool any_are_null = (prev_inst->value->type->id == ZigTypeIdNull);
11963 bool convert_to_const_slice = false;11963 bool convert_to_const_slice = false;
11964 bool make_the_slice_const = false;11964 bool make_the_slice_const = false;
11965 bool make_the_pointer_const = false;
11965 for (; i < instruction_count; i += 1) {11966 for (; i < instruction_count; i += 1) {
11966 IrInstGen *cur_inst = instructions[i];11967 IrInstGen *cur_inst = instructions[i];
11967 ZigType *cur_type = cur_inst->value->type;11968 ZigType *cur_type = cur_inst->value->type;
...@@ -12463,6 +12464,34 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT...@@ -12463,6 +12464,34 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
12463 }12464 }
12464 }12465 }
1246512466
12467 // *[N]T to [*]T
12468 if (prev_type->id == ZigTypeIdPointer &&
12469 prev_type->data.pointer.ptr_len == PtrLenSingle &&
12470 prev_type->data.pointer.child_type->id == ZigTypeIdArray &&
12471 ((cur_type->id == ZigTypeIdPointer && cur_type->data.pointer.ptr_len == PtrLenUnknown)))
12472 {
12473 prev_inst = cur_inst;
12474
12475 if (prev_type->data.pointer.is_const && !cur_type->data.pointer.is_const) {
12476 // const array pointer and non-const unknown pointer
12477 make_the_pointer_const = true;
12478 }
12479 continue;
12480 }
12481
12482 // *[N]T to [*]T
12483 if (cur_type->id == ZigTypeIdPointer &&
12484 cur_type->data.pointer.ptr_len == PtrLenSingle &&
12485 cur_type->data.pointer.child_type->id == ZigTypeIdArray &&
12486 ((prev_type->id == ZigTypeIdPointer && prev_type->data.pointer.ptr_len == PtrLenUnknown)))
12487 {
12488 if (cur_type->data.pointer.is_const && !prev_type->data.pointer.is_const) {
12489 // const array pointer and non-const unknown pointer
12490 make_the_pointer_const = true;
12491 }
12492 continue;
12493 }
12494
12466 // *[N]T to []T12495 // *[N]T to []T
12467 // *[N]T to E![]T12496 // *[N]T to E![]T
12468 if (cur_type->id == ZigTypeIdPointer &&12497 if (cur_type->id == ZigTypeIdPointer &&
...@@ -12677,6 +12706,8 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT...@@ -12677,6 +12706,8 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT
12677 } else {12706 } else {
12678 zig_unreachable();12707 zig_unreachable();
12679 }12708 }
12709 } else if (make_the_pointer_const) {
12710 return adjust_ptr_const(ira->codegen, prev_inst->value->type, make_the_pointer_const);
12680 } else {12711 } else {
12681 return prev_inst->value->type;12712 return prev_inst->value->type;
12682 }12713 }
test/stage1/behavior/cast.zig+19
...@@ -805,3 +805,22 @@ test "peer type resolve array pointers, one of them const" {...@@ -805,3 +805,22 @@ test "peer type resolve array pointers, one of them const" {
805 comptime expect(@TypeOf(&array1, &array2) == []const u8);805 comptime expect(@TypeOf(&array1, &array2) == []const u8);
806 comptime expect(@TypeOf(&array2, &array1) == []const u8);806 comptime expect(@TypeOf(&array2, &array1) == []const u8);
807}807}
808
809test "peer type resolve array pointer and unknown pointer" {
810 const const_array: [4]u8 = undefined;
811 var array: [4]u8 = undefined;
812 var const_ptr: [*]const u8 = undefined;
813 var ptr: [*]u8 = undefined;
814
815 comptime expect(@TypeOf(&array, ptr) == [*]u8);
816 comptime expect(@TypeOf(ptr, &array) == [*]u8);
817
818 comptime expect(@TypeOf(&const_array, ptr) == [*]const u8);
819 comptime expect(@TypeOf(ptr, &const_array) == [*]const u8);
820
821 comptime expect(@TypeOf(&array, const_ptr) == [*]const u8);
822 comptime expect(@TypeOf(const_ptr, &array) == [*]const u8);
823
824 comptime expect(@TypeOf(&const_array, const_ptr) == [*]const u8);
825 comptime expect(@TypeOf(const_ptr, &const_array) == [*]const u8);
826}