| ... | @@ -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 | } |
| 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 | // *[N]T to []T | 12495 | // *[N]T to []T |
| 12467 | // *[N]T to E![]T | 12496 | // *[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 | } |