diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-02-02 19:09:53 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-02-02 19:09:53 -0700 |
| commit | 8058b5e0a92e4eac05ba19aabed1fc041353c69b (patch) | |
| tree | 42b52618d9da5503dd4e7eb1702cf4d4be3a5a71 /src/analyze.cpp | |
| parent | 79adf55699a549841eba3eb07f1dbb19c4da9ed1 (diff) | |
| download | zig-8058b5e0a92e4eac05ba19aabed1fc041353c69b.tar.gz zig-8058b5e0a92e4eac05ba19aabed1fc041353c69b.zip | |
fix crash when incomplete struct used as argument
closes #107
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index bf6bcee289..c093f551f1 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -153,6 +153,34 @@ static int bits_needed_for_unsigned(uint64_t x) { } } +static bool type_is_complete(TypeTableEntry *type_entry) { + switch (type_entry->id) { + case TypeTableEntryIdInvalid: + zig_unreachable(); + case TypeTableEntryIdStruct: + return type_entry->data.structure.complete; + case TypeTableEntryIdEnum: + return type_entry->data.enumeration.complete; + case TypeTableEntryIdMetaType: + case TypeTableEntryIdVoid: + case TypeTableEntryIdBool: + case TypeTableEntryIdUnreachable: + case TypeTableEntryIdInt: + case TypeTableEntryIdFloat: + case TypeTableEntryIdPointer: + case TypeTableEntryIdArray: + case TypeTableEntryIdNumLitFloat: + case TypeTableEntryIdNumLitInt: + case TypeTableEntryIdUndefLit: + case TypeTableEntryIdMaybe: + case TypeTableEntryIdErrorUnion: + case TypeTableEntryIdPureError: + case TypeTableEntryIdFn: + case TypeTableEntryIdTypeDecl: + return true; + } +} + TypeTableEntry *get_smallest_unsigned_int_type(CodeGen *g, uint64_t x) { return get_int_type(g, false, bits_needed_for_unsigned(x)); } @@ -391,6 +419,7 @@ static TypeTableEntry *get_unknown_size_array_type(CodeGen *g, TypeTableEntry *c entry->type_ref = var_peer->type_ref; entry->di_type = var_peer->di_type; + entry->data.structure.complete = true; *parent_pointer = entry; return entry; @@ -421,6 +450,8 @@ static TypeTableEntry *get_unknown_size_array_type(CodeGen *g, TypeTableEntry *c buf_ptr(&entry->name), g->dummy_di_file, 0, entry->size_in_bits, entry->align_in_bits, 0, nullptr, di_element_types, element_count, 0, nullptr, ""); + entry->data.structure.complete = true; + *parent_pointer = entry; return entry; } @@ -527,6 +558,7 @@ TypeTableEntry *get_fn_type(CodeGen *g, FnTypeId fn_type_id) { gen_param_info->src_index = i; gen_param_info->gen_index = -1; + assert(type_is_complete(type_entry)); if (type_entry->size_in_bits > 0) { TypeTableEntry *gen_type; if (handle_is_ptr(type_entry)) { @@ -4751,7 +4783,7 @@ static void collect_expr_decl_deps(CodeGen *g, ImportTableEntry *import, AstNode if (!table_entry) { table_entry = import->block_context->type_table.maybe_get(name); } - if (!table_entry) { + if (!table_entry || !type_is_complete(table_entry->value)) { decl_node->deps.put(name, node); } break; |
