Skip to content

Commit 00885c3

Browse files
committed
Support sentinel in @type
1 parent 7d85c14 commit 00885c3

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

src/analyze.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -533,9 +533,10 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
533533

534534
TypeId type_id = {};
535535
ZigType **parent_pointer = nullptr;
536+
ZigValue *sentinel_unwrapped = get_sentinel_value(sentinel);
536537
if (host_int_bytes != 0 || is_volatile || byte_alignment != 0 || ptr_len != PtrLenSingle ||
537538
allow_zero || vector_index != VECTOR_INDEX_NONE || inferred_struct_field != nullptr ||
538-
sentinel != nullptr)
539+
sentinel_unwrapped != nullptr)
539540
{
540541
type_id.id = ZigTypeIdPointer;
541542
type_id.data.pointer.codegen = g;
@@ -549,7 +550,6 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
549550
type_id.data.pointer.allow_zero = allow_zero;
550551
type_id.data.pointer.vector_index = vector_index;
551552
type_id.data.pointer.inferred_struct_field = inferred_struct_field;
552-
assert(!sentinel || sentinel->type->id == ZigTypeIdOptional);
553553
type_id.data.pointer.sentinel = sentinel;
554554

555555
auto existing_entry = g->type_table.maybe_get(type_id);
@@ -578,13 +578,13 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
578578
buf_appendf(&entry->name, "[*");
579579
break;
580580
case PtrLenC:
581-
assert(sentinel == nullptr);
581+
assert(sentinel_unwrapped == nullptr);
582582
buf_appendf(&entry->name, "[*c]");
583583
break;
584584
}
585-
if (sentinel != nullptr) {
585+
if (sentinel_unwrapped != nullptr) {
586586
buf_appendf(&entry->name, ":");
587-
render_const_value(g, &entry->name, sentinel);
587+
render_const_value(g, &entry->name, sentinel_unwrapped);
588588
}
589589
switch (ptr_len) {
590590
case PtrLenSingle:
@@ -623,7 +623,6 @@ ZigType *get_pointer_to_type_extra2(CodeGen *g, ZigType *child_type, bool is_con
623623
entry->data.pointer.allow_zero = allow_zero;
624624
entry->data.pointer.vector_index = vector_index;
625625
entry->data.pointer.inferred_struct_field = inferred_struct_field;
626-
assert(!sentinel || sentinel->type->id == ZigTypeIdOptional);
627626
entry->data.pointer.sentinel = sentinel;
628627

629628
append_ptr_type_attrs(&entry->name, entry);
@@ -768,7 +767,6 @@ ZigType *get_array_type(CodeGen *g, ZigType *child_type, uint64_t array_size, Zi
768767
type_id.data.array.codegen = g;
769768
type_id.data.array.child_type = child_type;
770769
type_id.data.array.size = array_size;
771-
assert(!sentinel || sentinel->type->id == ZigTypeIdOptional);
772770
type_id.data.array.sentinel = sentinel;
773771
auto existing_entry = g->type_table.maybe_get(type_id);
774772
if (existing_entry) {
@@ -778,21 +776,22 @@ ZigType *get_array_type(CodeGen *g, ZigType *child_type, uint64_t array_size, Zi
778776
assert(type_is_resolved(child_type, ResolveStatusSizeKnown));
779777

780778
ZigType *entry = new_type_table_entry(ZigTypeIdArray);
779+
ZigValue *sentinel_unwrapped = get_sentinel_value(sentinel);
781780

782781
buf_resize(&entry->name, 0);
783782
buf_appendf(&entry->name, "[%" ZIG_PRI_u64, array_size);
784-
if (sentinel != nullptr) {
785-
assert(sentinel->type == get_optional_type(g, child_type));
783+
if (sentinel_unwrapped != nullptr) {
784+
assert(sentinel_unwrapped->type == child_type);
786785
buf_appendf(&entry->name, ":");
787-
render_const_value(g, &entry->name, sentinel);
786+
render_const_value(g, &entry->name, sentinel_unwrapped);
788787
}
789788
buf_appendf(&entry->name, "]%s", buf_ptr(&child_type->name));
790789

791790
size_t full_array_size;
792791
if (array_size == 0) {
793792
full_array_size = 0;
794793
} else {
795-
full_array_size = array_size + ((sentinel != nullptr) ? 1 : 0);
794+
full_array_size = array_size + ((sentinel_unwrapped != nullptr) ? 1 : 0);
796795
}
797796

798797
entry->size_in_bits = child_type->size_in_bits * full_array_size;
@@ -801,7 +800,6 @@ ZigType *get_array_type(CodeGen *g, ZigType *child_type, uint64_t array_size, Zi
801800

802801
entry->data.array.child_type = child_type;
803802
entry->data.array.len = array_size;
804-
assert(!sentinel || sentinel->type->id == ZigTypeIdOptional);
805803
entry->data.array.sentinel = sentinel;
806804

807805
g->type_table.put(type_id, entry);

0 commit comments

Comments
 (0)