| ... | ... | @@ -231,6 +231,7 @@ static ZigType *ir_resolve_atomic_operand_type(IrAnalyze *ira, IrInstGen *op); |
| 231 | 231 | static IrInstSrc *ir_lval_wrap(IrBuilderSrc *irb, Scope *scope, IrInstSrc *value, LVal lval, ResultLoc *result_loc); |
| 232 | 232 | static IrInstSrc *ir_expr_wrap(IrBuilderSrc *irb, Scope *scope, IrInstSrc *inst, ResultLoc *result_loc); |
| 233 | 233 | static ZigType *adjust_ptr_align(CodeGen *g, ZigType *ptr_type, uint32_t new_align); |
| 234 | static ZigType *adjust_ptr_const(CodeGen *g, ZigType *ptr_type, bool is_const); |
| 234 | 235 | static ZigType *adjust_slice_align(CodeGen *g, ZigType *slice_type, uint32_t new_align); |
| 235 | 236 | static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *source_node, uint8_t *buf, ZigValue *val); |
| 236 | 237 | static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ZigValue *val); |
| ... | ... | @@ -11844,6 +11845,7 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 11844 | 11845 | |
| 11845 | 11846 | bool any_are_null = (prev_inst->value->type->id == ZigTypeIdNull); |
| 11846 | 11847 | bool convert_to_const_slice = false; |
| 11848 | bool make_the_slice_const = false; |
| 11847 | 11849 | for (; i < instruction_count; i += 1) { |
| 11848 | 11850 | IrInstGen *cur_inst = instructions[i]; |
| 11849 | 11851 | ZigType *cur_type = cur_inst->value->type; |
| ... | ... | @@ -12357,12 +12359,12 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12357 | 12359 | ZigType *slice_type = (prev_type->id == ZigTypeIdErrorUnion) ? |
| 12358 | 12360 | prev_type->data.error_union.payload_type : prev_type; |
| 12359 | 12361 | ZigType *slice_ptr_type = slice_type->data.structure.fields[slice_ptr_index]->type_entry; |
| 12360 | | if ((slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 || |
| 12361 | | !cur_type->data.pointer.is_const) && |
| 12362 | | types_match_const_cast_only(ira, |
| 12363 | | slice_ptr_type->data.pointer.child_type, |
| 12362 | if (types_match_const_cast_only(ira, slice_ptr_type->data.pointer.child_type, |
| 12364 | 12363 | array_type->data.array.child_type, source_node, false).id == ConstCastResultIdOk) |
| 12365 | 12364 | { |
| 12365 | bool const_ok = (slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 || |
| 12366 | !cur_type->data.pointer.is_const); |
| 12367 | if (!const_ok) make_the_slice_const = true; |
| 12366 | 12368 | convert_to_const_slice = false; |
| 12367 | 12369 | continue; |
| 12368 | 12370 | } |
| ... | ... | @@ -12391,12 +12393,12 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12391 | 12393 | break; |
| 12392 | 12394 | } |
| 12393 | 12395 | ZigType *slice_ptr_type = slice_type->data.structure.fields[slice_ptr_index]->type_entry; |
| 12394 | | if ((slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 || |
| 12395 | | !prev_type->data.pointer.is_const) && |
| 12396 | | types_match_const_cast_only(ira, |
| 12397 | | slice_ptr_type->data.pointer.child_type, |
| 12396 | if (types_match_const_cast_only(ira, slice_ptr_type->data.pointer.child_type, |
| 12398 | 12397 | array_type->data.array.child_type, source_node, false).id == ConstCastResultIdOk) |
| 12399 | 12398 | { |
| 12399 | bool const_ok = (slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 || |
| 12400 | !prev_type->data.pointer.is_const); |
| 12401 | if (!const_ok) make_the_slice_const = true; |
| 12400 | 12402 | prev_inst = cur_inst; |
| 12401 | 12403 | convert_to_const_slice = false; |
| 12402 | 12404 | continue; |
| ... | ... | @@ -12408,8 +12410,6 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12408 | 12410 | cur_type->data.pointer.child_type->id == ZigTypeIdArray && |
| 12409 | 12411 | prev_type->id == ZigTypeIdPointer && prev_type->data.pointer.ptr_len == PtrLenSingle && |
| 12410 | 12412 | prev_type->data.pointer.child_type->id == ZigTypeIdArray && |
| 12411 | | (cur_type->data.pointer.is_const || !prev_type->data.pointer.is_const || |
| 12412 | | prev_type->data.pointer.child_type->data.array.len == 0) && |
| 12413 | 12413 | ( |
| 12414 | 12414 | prev_type->data.pointer.child_type->data.array.sentinel == nullptr || |
| 12415 | 12415 | (cur_type->data.pointer.child_type->data.array.sentinel != nullptr && |
| ... | ... | @@ -12421,6 +12421,9 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12421 | 12421 | prev_type->data.pointer.child_type->data.array.child_type, |
| 12422 | 12422 | source_node, !cur_type->data.pointer.is_const).id == ConstCastResultIdOk) |
| 12423 | 12423 | { |
| 12424 | bool const_ok = (cur_type->data.pointer.is_const || !prev_type->data.pointer.is_const || |
| 12425 | prev_type->data.pointer.child_type->data.array.len == 0); |
| 12426 | if (!const_ok) make_the_slice_const = true; |
| 12424 | 12427 | prev_inst = cur_inst; |
| 12425 | 12428 | convert_to_const_slice = true; |
| 12426 | 12429 | continue; |
| ... | ... | @@ -12429,8 +12432,6 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12429 | 12432 | prev_type->data.pointer.child_type->id == ZigTypeIdArray && |
| 12430 | 12433 | cur_type->id == ZigTypeIdPointer && cur_type->data.pointer.ptr_len == PtrLenSingle && |
| 12431 | 12434 | cur_type->data.pointer.child_type->id == ZigTypeIdArray && |
| 12432 | | (prev_type->data.pointer.is_const || !cur_type->data.pointer.is_const || |
| 12433 | | cur_type->data.pointer.child_type->data.array.len == 0) && |
| 12434 | 12435 | ( |
| 12435 | 12436 | cur_type->data.pointer.child_type->data.array.sentinel == nullptr || |
| 12436 | 12437 | (prev_type->data.pointer.child_type->data.array.sentinel != nullptr && |
| ... | ... | @@ -12442,6 +12443,9 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12442 | 12443 | cur_type->data.pointer.child_type->data.array.child_type, |
| 12443 | 12444 | source_node, !prev_type->data.pointer.is_const).id == ConstCastResultIdOk) |
| 12444 | 12445 | { |
| 12446 | bool const_ok = (prev_type->data.pointer.is_const || !cur_type->data.pointer.is_const || |
| 12447 | cur_type->data.pointer.child_type->data.array.len == 0); |
| 12448 | if (!const_ok) make_the_slice_const = true; |
| 12445 | 12449 | convert_to_const_slice = true; |
| 12446 | 12450 | continue; |
| 12447 | 12451 | } |
| ... | ... | @@ -12486,7 +12490,7 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12486 | 12490 | src_assert(array_type->id == ZigTypeIdArray, source_node); |
| 12487 | 12491 | ZigType *ptr_type = get_pointer_to_type_extra2( |
| 12488 | 12492 | ira->codegen, array_type->data.array.child_type, |
| 12489 | | prev_inst->value->type->data.pointer.is_const, false, |
| 12493 | prev_inst->value->type->data.pointer.is_const || make_the_slice_const, false, |
| 12490 | 12494 | PtrLenUnknown, |
| 12491 | 12495 | 0, 0, 0, false, |
| 12492 | 12496 | VECTOR_INDEX_NONE, nullptr, array_type->data.array.sentinel); |
| ... | ... | @@ -12537,6 +12541,26 @@ static ZigType *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_node, ZigT |
| 12537 | 12541 | return ira->codegen->builtin_types.entry_invalid; |
| 12538 | 12542 | return get_optional_type(ira->codegen, prev_inst->value->type); |
| 12539 | 12543 | } |
| 12544 | } else if (make_the_slice_const) { |
| 12545 | ZigType *slice_type; |
| 12546 | if (prev_inst->value->type->id == ZigTypeIdErrorUnion) { |
| 12547 | slice_type = prev_inst->value->type->data.error_union.payload_type; |
| 12548 | } else if (is_slice(prev_inst->value->type)) { |
| 12549 | slice_type = prev_inst->value->type; |
| 12550 | } else { |
| 12551 | zig_unreachable(); |
| 12552 | } |
| 12553 | ZigType *slice_ptr_type = slice_type->data.structure.fields[slice_ptr_index]->type_entry; |
| 12554 | ZigType *adjusted_ptr_type = adjust_ptr_const(ira->codegen, slice_ptr_type, make_the_slice_const); |
| 12555 | ZigType *adjusted_slice_type = get_slice_type(ira->codegen, adjusted_ptr_type); |
| 12556 | if (prev_inst->value->type->id == ZigTypeIdErrorUnion) { |
| 12557 | return get_error_union_type(ira->codegen, prev_inst->value->type->data.error_union.err_set_type, |
| 12558 | adjusted_slice_type); |
| 12559 | } else if (is_slice(prev_inst->value->type)) { |
| 12560 | return adjusted_slice_type; |
| 12561 | } else { |
| 12562 | zig_unreachable(); |
| 12563 | } |
| 12540 | 12564 | } else { |
| 12541 | 12565 | return prev_inst->value->type; |
| 12542 | 12566 | } |
| ... | ... | @@ -20708,24 +20732,44 @@ static ZigType *adjust_slice_align(CodeGen *g, ZigType *slice_type, uint32_t new |
| 20708 | 20732 | |
| 20709 | 20733 | static ZigType *adjust_ptr_len(CodeGen *g, ZigType *ptr_type, PtrLen ptr_len) { |
| 20710 | 20734 | assert(ptr_type->id == ZigTypeIdPointer); |
| 20711 | | return get_pointer_to_type_extra(g, |
| 20735 | return get_pointer_to_type_extra2(g, |
| 20712 | 20736 | ptr_type->data.pointer.child_type, |
| 20713 | 20737 | ptr_type->data.pointer.is_const, ptr_type->data.pointer.is_volatile, |
| 20714 | 20738 | ptr_len, |
| 20715 | 20739 | ptr_type->data.pointer.explicit_alignment, |
| 20716 | 20740 | ptr_type->data.pointer.bit_offset_in_host, ptr_type->data.pointer.host_int_bytes, |
| 20717 | | ptr_type->data.pointer.allow_zero); |
| 20741 | ptr_type->data.pointer.allow_zero, |
| 20742 | ptr_type->data.pointer.vector_index, |
| 20743 | ptr_type->data.pointer.inferred_struct_field, |
| 20744 | ptr_type->data.pointer.sentinel); |
| 20718 | 20745 | } |
| 20719 | 20746 | |
| 20720 | 20747 | static ZigType *adjust_ptr_allow_zero(CodeGen *g, ZigType *ptr_type, bool allow_zero) { |
| 20721 | 20748 | assert(ptr_type->id == ZigTypeIdPointer); |
| 20722 | | return get_pointer_to_type_extra(g, |
| 20749 | return get_pointer_to_type_extra2(g, |
| 20723 | 20750 | ptr_type->data.pointer.child_type, |
| 20724 | 20751 | ptr_type->data.pointer.is_const, ptr_type->data.pointer.is_volatile, |
| 20725 | 20752 | ptr_type->data.pointer.ptr_len, |
| 20726 | 20753 | ptr_type->data.pointer.explicit_alignment, |
| 20727 | 20754 | ptr_type->data.pointer.bit_offset_in_host, ptr_type->data.pointer.host_int_bytes, |
| 20728 | | allow_zero); |
| 20755 | allow_zero, |
| 20756 | ptr_type->data.pointer.vector_index, |
| 20757 | ptr_type->data.pointer.inferred_struct_field, |
| 20758 | ptr_type->data.pointer.sentinel); |
| 20759 | } |
| 20760 | |
| 20761 | static ZigType *adjust_ptr_const(CodeGen *g, ZigType *ptr_type, bool is_const) { |
| 20762 | assert(ptr_type->id == ZigTypeIdPointer); |
| 20763 | return get_pointer_to_type_extra2(g, |
| 20764 | ptr_type->data.pointer.child_type, |
| 20765 | is_const, ptr_type->data.pointer.is_volatile, |
| 20766 | ptr_type->data.pointer.ptr_len, |
| 20767 | ptr_type->data.pointer.explicit_alignment, |
| 20768 | ptr_type->data.pointer.bit_offset_in_host, ptr_type->data.pointer.host_int_bytes, |
| 20769 | ptr_type->data.pointer.allow_zero, |
| 20770 | ptr_type->data.pointer.vector_index, |
| 20771 | ptr_type->data.pointer.inferred_struct_field, |
| 20772 | ptr_type->data.pointer.sentinel); |
| 20729 | 20773 | } |
| 20730 | 20774 | |
| 20731 | 20775 | static Error compute_elem_align(IrAnalyze *ira, ZigType *elem_type, uint32_t base_ptr_align, |