aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-02-02 19:09:53 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-02-02 19:09:53 -0700
commit8058b5e0a92e4eac05ba19aabed1fc041353c69b (patch)
tree42b52618d9da5503dd4e7eb1702cf4d4be3a5a71 /src/analyze.cpp
parent79adf55699a549841eba3eb07f1dbb19c4da9ed1 (diff)
downloadzig-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.cpp34
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;