@@ -533,9 +533,10 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
533
533
534
534
TypeId type_id = {};
535
535
ZigType **parent_pointer = nullptr;
536
+ ZigValue *sentinel_unwrapped = get_sentinel_value(sentinel);
536
537
if (host_int_bytes != 0 || is_volatile || byte_alignment != 0 || ptr_len != PtrLenSingle ||
537
538
allow_zero || vector_index != VECTOR_INDEX_NONE || inferred_struct_field != nullptr ||
538
- sentinel != nullptr)
539
+ sentinel_unwrapped != nullptr)
539
540
{
540
541
type_id.id = ZigTypeIdPointer;
541
542
type_id.data.pointer.codegen = g;
@@ -577,13 +578,13 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
577
578
buf_appendf(&entry->name, "[*");
578
579
break;
579
580
case PtrLenC:
580
- assert(sentinel == nullptr);
581
+ assert(sentinel_unwrapped == nullptr);
581
582
buf_appendf(&entry->name, "[*c]");
582
583
break;
583
584
}
584
- if (sentinel != nullptr) {
585
+ if (sentinel_unwrapped != nullptr) {
585
586
buf_appendf(&entry->name, ":");
586
- render_const_value(g, &entry->name, sentinel );
587
+ render_const_value(g, &entry->name, sentinel_unwrapped );
587
588
}
588
589
switch (ptr_len) {
589
590
case PtrLenSingle:
@@ -775,20 +776,22 @@ ZigType *get_array_type(CodeGen *g, ZigType *child_type, uint64_t array_size, Zi
775
776
assert(type_is_resolved(child_type, ResolveStatusSizeKnown));
776
777
777
778
ZigType *entry = new_type_table_entry(ZigTypeIdArray);
779
+ ZigValue *sentinel_unwrapped = get_sentinel_value(sentinel);
778
780
779
781
buf_resize(&entry->name, 0);
780
782
buf_appendf(&entry->name, "[%" ZIG_PRI_u64, array_size);
781
- if (sentinel != nullptr) {
783
+ if (sentinel_unwrapped != nullptr) {
784
+ assert(sentinel_unwrapped->type == child_type);
782
785
buf_appendf(&entry->name, ":");
783
- render_const_value(g, &entry->name, sentinel );
786
+ render_const_value(g, &entry->name, sentinel_unwrapped );
784
787
}
785
788
buf_appendf(&entry->name, "]%s", buf_ptr(&child_type->name));
786
789
787
790
size_t full_array_size;
788
791
if (array_size == 0) {
789
792
full_array_size = 0;
790
793
} else {
791
- full_array_size = array_size + ((sentinel != nullptr) ? 1 : 0);
794
+ full_array_size = array_size + ((sentinel_unwrapped != nullptr) ? 1 : 0);
792
795
}
793
796
794
797
entry->size_in_bits = child_type->size_in_bits * full_array_size;
@@ -816,9 +819,12 @@ ZigType *get_slice_type(CodeGen *g, ZigType *ptr_type) {
816
819
817
820
buf_resize(&entry->name, 0);
818
821
buf_appendf(&entry->name, "[");
819
- if (ptr_type->data.pointer.sentinel != nullptr) {
820
- buf_appendf(&entry->name, ":");
821
- render_const_value(g, &entry->name, ptr_type->data.pointer.sentinel);
822
+ {
823
+ ZigValue *sentinel = get_sentinel_value(ptr_type->data.pointer.sentinel);
824
+ if (sentinel != nullptr) {
825
+ buf_appendf(&entry->name, ":");
826
+ render_const_value(g, &entry->name, sentinel);
827
+ }
822
828
}
823
829
buf_appendf(&entry->name, "]");
824
830
append_ptr_type_attrs(&entry->name, ptr_type);
@@ -5660,7 +5666,7 @@ void init_const_str_lit(CodeGen *g, ZigValue *const_val, Buf *str) {
5660
5666
// first we build the underlying array
5661
5667
ZigValue *array_val = create_const_vals(1);
5662
5668
array_val->special = ConstValSpecialStatic;
5663
- array_val->type = get_array_type(g, g->builtin_types.entry_u8, buf_len(str), g->intern.for_zero_byte ());
5669
+ array_val->type = get_array_type(g, g->builtin_types.entry_u8, buf_len(str), g->intern.for_optional_zero_byte ());
5664
5670
array_val->data.x_array.special = ConstArraySpecialBuf;
5665
5671
array_val->data.x_array.data.s_buf = str;
5666
5672
@@ -7067,11 +7073,13 @@ uint32_t type_id_hash(TypeId x) {
7067
7073
(((uint32_t)x.data.pointer.bit_offset_in_host) ^ (uint32_t)2639019452) +
7068
7074
(((uint32_t)x.data.pointer.vector_index) ^ (uint32_t)0x19199716) +
7069
7075
(((uint32_t)x.data.pointer.host_int_bytes) ^ (uint32_t)529908881) *
7070
- (x.data.pointer.sentinel ? hash_const_val(x.data.pointer.sentinel) : (uint32_t)2955491856);
7076
+ (get_sentinel_value(x.data.pointer.sentinel) ?
7077
+ hash_const_val(get_sentinel_value(x.data.pointer.sentinel)) : (uint32_t)2955491856);
7071
7078
case ZigTypeIdArray:
7072
7079
return hash_ptr(x.data.array.child_type) *
7073
7080
((uint32_t)x.data.array.size ^ (uint32_t)2122979968) *
7074
- (x.data.array.sentinel ? hash_const_val(x.data.array.sentinel) : (uint32_t)1927201585);
7081
+ (get_sentinel_value(x.data.array.sentinel) ?
7082
+ hash_const_val(get_sentinel_value(x.data.array.sentinel)) : (uint32_t)1927201585);
7075
7083
case ZigTypeIdInt:
7076
7084
return (x.data.integer.is_signed ? (uint32_t)2652528194 : (uint32_t)163929201) +
7077
7085
(((uint32_t)x.data.integer.bit_count) ^ (uint32_t)2998081557);
@@ -8687,7 +8695,9 @@ static void resolve_llvm_types_array(CodeGen *g, ZigType *type) {
8687
8695
8688
8696
ZigType *elem_type = type->data.array.child_type;
8689
8697
8690
- uint64_t extra_len_from_sentinel = (type->data.array.sentinel != nullptr) ? 1 : 0;
8698
+ // TODO: should this size be 1 or sizeof sentinel?
8699
+ ZigValue *sentinel = get_sentinel_value(type->data.array.sentinel);
8700
+ uint64_t extra_len_from_sentinel = (sentinel != nullptr) ? 1 : 0;
8691
8701
uint64_t full_len = type->data.array.len + extra_len_from_sentinel;
8692
8702
// TODO https://github.com/ziglang/zig/issues/1424
8693
8703
type->llvm_type = LLVMArrayType(get_llvm_type(g, elem_type), (unsigned)full_len);
0 commit comments