Commit a76a72469b

Andrew Kelley <superjoe30@gmail.com>
2018-09-05 16:43:35
stage1: fix crash when invalid type used in array type
closes #1186
1 parent 3e94650
Changed files (2)
src/ir.cpp
@@ -15474,6 +15474,8 @@ static TypeTableEntry *ir_analyze_instruction_asm(IrAnalyze *ira, IrInstructionA
 static TypeTableEntry *ir_analyze_instruction_array_type(IrAnalyze *ira,
         IrInstructionArrayType *array_type_instruction)
 {
+    Error err;
+
     IrInstruction *size_value = array_type_instruction->size->other;
     uint64_t size;
     if (!ir_resolve_usize(ira, size_value, &size))
@@ -15515,6 +15517,8 @@ static TypeTableEntry *ir_analyze_instruction_array_type(IrAnalyze *ira,
         case TypeTableEntryIdBoundFn:
         case TypeTableEntryIdPromise:
             {
+                if ((err = ensure_complete_type(ira->codegen, child_type)))
+                    return ira->codegen->builtin_types.entry_invalid;
                 TypeTableEntry *result_type = get_array_type(ira->codegen, child_type, size);
                 ConstExprValue *out_val = ir_build_const_from(ira, &array_type_instruction->base);
                 out_val->data.x_type = result_type;
test/compile_errors.zig
@@ -1,6 +1,19 @@
 const tests = @import("tests.zig");
 
 pub fn addCases(cases: *tests.CompileErrorContext) void {
+    cases.add(
+        "invalid type used in array type",
+        \\const Item = struct {
+        \\    field: SomeNonexistentType,
+        \\};
+        \\var items: [100]Item = undefined;
+        \\export fn entry() void {
+        \\    const a = items[0];
+        \\}
+    ,
+        ".tmp_source.zig:2:12: error: use of undeclared identifier 'SomeNonexistentType'",
+    );
+
     cases.add(
         "@noInlineCall on an inline function",
         \\inline fn foo() void {}