authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-04 21:42:35-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-04 21:42:35-07:00
loge1ff201d60e6eb28c7e5ca5110b27b1e35194b82
treedba0a9619d78374a0b0c90bc0f4c20ca7a07ad0e
parente0aa0736be47e5e1383d8fb25f744f95c5a830ba

fix crash when struct field is invalid


3 files changed, 19 insertions(+), 10 deletions(-)

example/rand/main.zig+2
......@@ -1,3 +1,5 @@
1export executable "rand";
2
13// Mersenne Twister
24const ARRAY_SIZE : u16 = 624;
35
src/analyze.cpp+16-10
......@@ -429,6 +429,9 @@ static void resolve_struct_type(CodeGen *g, ImportTableEntry *import, TypeTableE
429429
430430 if (type_struct_field->type_entry->id == TypeTableEntryIdStruct) {
431431 resolve_struct_type(g, import, type_struct_field->type_entry);
432 } else if (type_struct_field->type_entry->id == TypeTableEntryIdInvalid) {
433 struct_type->data.structure.is_invalid = true;
434 continue;
432435 }
433436
434437 di_element_types[i] = LLVMZigCreateDebugMemberType(g->dbuilder,
......@@ -451,19 +454,22 @@ static void resolve_struct_type(CodeGen *g, ImportTableEntry *import, TypeTableE
451454 }
452455 struct_type->data.structure.embedded_in_current = false;
453456
454 LLVMStructSetBody(struct_type->type_ref, element_types, field_count, false);
457 if (!struct_type->data.structure.is_invalid) {
458
459 LLVMStructSetBody(struct_type->type_ref, element_types, field_count, false);
455460
456 struct_type->align_in_bits = first_field_align_in_bits;
457 struct_type->size_in_bits = total_size_in_bits;
461 struct_type->align_in_bits = first_field_align_in_bits;
462 struct_type->size_in_bits = total_size_in_bits;
458463
459 LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugStructType(g->dbuilder,
460 LLVMZigFileToScope(import->di_file),
461 buf_ptr(&decl_node->data.struct_decl.name),
462 import->di_file, decl_node->line + 1, struct_type->size_in_bits, struct_type->align_in_bits, 0,
463 nullptr, di_element_types, field_count, 0, nullptr, "");
464 LLVMZigDIType *replacement_di_type = LLVMZigCreateDebugStructType(g->dbuilder,
465 LLVMZigFileToScope(import->di_file),
466 buf_ptr(&decl_node->data.struct_decl.name),
467 import->di_file, decl_node->line + 1, struct_type->size_in_bits, struct_type->align_in_bits, 0,
468 nullptr, di_element_types, field_count, 0, nullptr, "");
464469
465 LLVMZigReplaceTemporary(g->dbuilder, struct_type->di_type, replacement_di_type);
466 struct_type->di_type = replacement_di_type;
470 LLVMZigReplaceTemporary(g->dbuilder, struct_type->di_type, replacement_di_type);
471 struct_type->di_type = replacement_di_type;
472 }
467473}
468474
469475static void preview_fn_def(CodeGen *g, ImportTableEntry *import, AstNode *node, TypeTableEntry *struct_type) {
src/analyze.hpp+1
......@@ -45,6 +45,7 @@ struct TypeTableEntryStruct {
4545 int field_count;
4646 TypeStructField *fields;
4747 uint64_t size_bytes;
48 bool is_invalid; // true if any fields are invalid
4849 // reminder: hash tables must be initialized before use
4950 HashMap<Buf *, FnTableEntry *, buf_hash, buf_eql_buf> fn_table;
5051