| ... | ... | @@ -11962,6 +11962,7 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 11962 | 11962 | bool any_are_null = (prev_inst->value->type->id == ZigTypeIdNull); |
| 11963 | 11963 | bool convert_to_const_slice = false; |
| 11964 | 11964 | bool make_the_slice_const = false; |
| 11965 | bool make_the_pointer_const = false; |
| 11965 | 11966 | for (; i < instruction_count; i += 1) { |
| 11966 | 11967 | IrInstGen *cur_inst = instructions[i]; |
| 11967 | 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 | 12464 | } |
| 12464 | 12465 | } |
| 12465 | 12466 | |
| 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 | 12495 | // *[N]T to []T |
| 12467 | 12496 | // *[N]T to E![]T |
| 12468 | 12497 | if (cur_type->id == ZigTypeIdPointer && |
| ... | ... | @@ -12677,6 +12706,8 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12677 | 12706 | } else { |
| 12678 | 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 | 12711 | } else { |
| 12681 | 12712 | return prev_inst->value->type; |
| 12682 | 12713 | } |