| ... | ... | @@ -153,6 +153,34 @@ static int bits_needed_for_unsigned(uint64_t x) { |
| 153 | 153 | } |
| 154 | 154 | } |
| 155 | 155 | |
| 156 | static bool type_is_complete(TypeTableEntry *type_entry) { |
| 157 | switch (type_entry->id) { |
| 158 | case TypeTableEntryIdInvalid: |
| 159 | zig_unreachable(); |
| 160 | case TypeTableEntryIdStruct: |
| 161 | return type_entry->data.structure.complete; |
| 162 | case TypeTableEntryIdEnum: |
| 163 | return type_entry->data.enumeration.complete; |
| 164 | case TypeTableEntryIdMetaType: |
| 165 | case TypeTableEntryIdVoid: |
| 166 | case TypeTableEntryIdBool: |
| 167 | case TypeTableEntryIdUnreachable: |
| 168 | case TypeTableEntryIdInt: |
| 169 | case TypeTableEntryIdFloat: |
| 170 | case TypeTableEntryIdPointer: |
| 171 | case TypeTableEntryIdArray: |
| 172 | case TypeTableEntryIdNumLitFloat: |
| 173 | case TypeTableEntryIdNumLitInt: |
| 174 | case TypeTableEntryIdUndefLit: |
| 175 | case TypeTableEntryIdMaybe: |
| 176 | case TypeTableEntryIdErrorUnion: |
| 177 | case TypeTableEntryIdPureError: |
| 178 | case TypeTableEntryIdFn: |
| 179 | case TypeTableEntryIdTypeDecl: |
| 180 | return true; |
| 181 | } |
| 182 | } |
| 183 | |
| 156 | 184 | TypeTableEntry *get_smallest_unsigned_int_type(CodeGen *g, uint64_t x) { |
| 157 | 185 | return get_int_type(g, false, bits_needed_for_unsigned(x)); |
| 158 | 186 | } |
| ... | ... | @@ -391,6 +419,7 @@ static TypeTableEntry *get_unknown_size_array_type(CodeGen *g, TypeTableEntry *c |
| 391 | 419 | |
| 392 | 420 | entry->type_ref = var_peer->type_ref; |
| 393 | 421 | entry->di_type = var_peer->di_type; |
| 422 | entry->data.structure.complete = true; |
| 394 | 423 | |
| 395 | 424 | *parent_pointer = entry; |
| 396 | 425 | return entry; |
| ... | ... | @@ -421,6 +450,8 @@ static TypeTableEntry *get_unknown_size_array_type(CodeGen *g, TypeTableEntry *c |
| 421 | 450 | buf_ptr(&entry->name), g->dummy_di_file, 0, entry->size_in_bits, entry->align_in_bits, 0, |
| 422 | 451 | nullptr, di_element_types, element_count, 0, nullptr, ""); |
| 423 | 452 | |
| 453 | entry->data.structure.complete = true; |
| 454 | |
| 424 | 455 | *parent_pointer = entry; |
| 425 | 456 | return entry; |
| 426 | 457 | } |
| ... | ... | @@ -527,6 +558,7 @@ TypeTableEntry *get_fn_type(CodeGen *g, FnTypeId fn_type_id) { |
| 527 | 558 | gen_param_info->src_index = i; |
| 528 | 559 | gen_param_info->gen_index = -1; |
| 529 | 560 | |
| 561 | assert(type_is_complete(type_entry)); |
| 530 | 562 | if (type_entry->size_in_bits > 0) { |
| 531 | 563 | TypeTableEntry *gen_type; |
| 532 | 564 | if (handle_is_ptr(type_entry)) { |
| ... | ... | @@ -4751,7 +4783,7 @@ static void collect_expr_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode |
| 4751 | 4783 | if (!table_entry) { |
| 4752 | 4784 | table_entry = import->block_context->type_table.maybe_get(name); |
| 4753 | 4785 | } |
| 4754 | | if (!table_entry) { |
| 4786 | if (!table_entry || !type_is_complete(table_entry->value)) { |
| 4755 | 4787 | decl_node->deps.put(name, node); |
| 4756 | 4788 | } |
| 4757 | 4789 | break; |