@@ -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,
0 commit comments