@@ -549,6 +549,7 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
549
549
type_id.data .pointer .allow_zero = allow_zero;
550
550
type_id.data .pointer .vector_index = vector_index;
551
551
type_id.data .pointer .inferred_struct_field = inferred_struct_field;
552
+ assert (!sentinel || sentinel->type ->id == ZigTypeIdOptional);
552
553
type_id.data .pointer .sentinel = sentinel;
553
554
554
555
auto existing_entry = g->type_table .maybe_get (type_id);
@@ -622,6 +623,7 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
622
623
entry->data .pointer .allow_zero = allow_zero;
623
624
entry->data .pointer .vector_index = vector_index;
624
625
entry->data .pointer .inferred_struct_field = inferred_struct_field;
626
+ assert (!sentinel || sentinel->type ->id == ZigTypeIdOptional);
625
627
entry->data .pointer .sentinel = sentinel;
626
628
627
629
append_ptr_type_attrs (&entry->name , entry);
@@ -766,6 +768,7 @@ ZigType *get_array_type(CodeGen *g, ZigType *child_type, uint64_t array_size, Zi
766
768
type_id.data .array .codegen = g;
767
769
type_id.data .array .child_type = child_type;
768
770
type_id.data .array .size = array_size;
771
+ assert (!sentinel || sentinel->type ->id == ZigTypeIdOptional);
769
772
type_id.data .array .sentinel = sentinel;
770
773
auto existing_entry = g->type_table .maybe_get (type_id);
771
774
if (existing_entry) {
@@ -779,6 +782,7 @@ ZigType *get_array_type(CodeGen *g, ZigType *child_type, uint64_t array_size, Zi
779
782
buf_resize (&entry->name , 0 );
780
783
buf_appendf (&entry->name , " [%" ZIG_PRI_u64, array_size);
781
784
if (sentinel != nullptr ) {
785
+ assert (sentinel->type == get_optional_type (g, child_type));
782
786
buf_appendf (&entry->name , " :" );
783
787
render_const_value (g, &entry->name , sentinel);
784
788
}
@@ -797,6 +801,7 @@ ZigType *get_array_type(CodeGen *g, ZigType *child_type, uint64_t array_size, Zi
797
801
798
802
entry->data .array .child_type = child_type;
799
803
entry->data .array .len = array_size;
804
+ assert (!sentinel || sentinel->type ->id == ZigTypeIdOptional);
800
805
entry->data .array .sentinel = sentinel;
801
806
802
807
g->type_table .put (type_id, entry);
@@ -816,9 +821,12 @@ ZigType *get_slice_type(CodeGen *g, ZigType *ptr_type) {
816
821
817
822
buf_resize (&entry->name , 0 );
818
823
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 );
824
+ {
825
+ ZigValue *sentinel = get_sentinel_value (ptr_type->data .pointer .sentinel );
826
+ if (sentinel != nullptr ) {
827
+ buf_appendf (&entry->name , " :" );
828
+ render_const_value (g, &entry->name , sentinel);
829
+ }
822
830
}
823
831
buf_appendf (&entry->name , " ]" );
824
832
append_ptr_type_attrs (&entry->name , ptr_type);
@@ -5659,7 +5667,7 @@ void init_const_str_lit(CodeGen *g, ZigValue *const_val, Buf *str) {
5659
5667
// first we build the underlying array
5660
5668
ZigValue *array_val = create_const_vals (1 );
5661
5669
array_val->special = ConstValSpecialStatic;
5662
- array_val->type = get_array_type (g, g->builtin_types .entry_u8 , buf_len (str), g->intern .for_zero_byte ());
5670
+ array_val->type = get_array_type (g, g->builtin_types .entry_u8 , buf_len (str), g->intern .for_optional_zero_byte ());
5663
5671
array_val->data .x_array .special = ConstArraySpecialBuf;
5664
5672
array_val->data .x_array .data .s_buf = str;
5665
5673
@@ -7072,11 +7080,13 @@ uint32_t type_id_hash(TypeId x) {
7072
7080
(((uint32_t )x.data .pointer .bit_offset_in_host ) ^ (uint32_t )2639019452 ) +
7073
7081
(((uint32_t )x.data .pointer .vector_index ) ^ (uint32_t )0x19199716 ) +
7074
7082
(((uint32_t )x.data .pointer .host_int_bytes ) ^ (uint32_t )529908881 ) *
7075
- (x.data .pointer .sentinel ? hash_const_val (x.data .pointer .sentinel ) : (uint32_t )2955491856 );
7083
+ (get_sentinel_value (x.data .pointer .sentinel ) ?
7084
+ hash_const_val (get_sentinel_value (x.data .pointer .sentinel )) : (uint32_t )2955491856 );
7076
7085
case ZigTypeIdArray:
7077
7086
return hash_ptr (x.data .array .child_type ) *
7078
7087
((uint32_t )x.data .array .size ^ (uint32_t )2122979968 ) *
7079
- (x.data .array .sentinel ? hash_const_val (x.data .array .sentinel ) : (uint32_t )1927201585 );
7088
+ (get_sentinel_value (x.data .array .sentinel ) ?
7089
+ hash_const_val (get_sentinel_value (x.data .array .sentinel )) : (uint32_t )1927201585 );
7080
7090
case ZigTypeIdInt:
7081
7091
return (x.data .integer .is_signed ? (uint32_t )2652528194 : (uint32_t )163929201 ) +
7082
7092
(((uint32_t )x.data .integer .bit_count ) ^ (uint32_t )2998081557 );
@@ -8692,7 +8702,9 @@ static void resolve_llvm_types_array(CodeGen *g, ZigType *type) {
8692
8702
8693
8703
ZigType *elem_type = type->data .array .child_type ;
8694
8704
8695
- uint64_t extra_len_from_sentinel = (type->data .array .sentinel != nullptr ) ? 1 : 0 ;
8705
+ // TODO: should this size be 1 or sizeof sentinel?
8706
+ ZigValue *sentinel = get_sentinel_value (type->data .array .sentinel );
8707
+ uint64_t extra_len_from_sentinel = (sentinel != nullptr ) ? 1 : 0 ;
8696
8708
uint64_t full_len = type->data .array .len + extra_len_from_sentinel;
8697
8709
// TODO https://github.com/ziglang/zig/issues/1424
8698
8710
type->llvm_type = LLVMArrayType (get_llvm_type (g, elem_type), (unsigned )full_len);
0 commit comments