commit a76a72469bf5980946fad8f8e60f07edde543ce5 (tree)
parent 3e94650ef7bd2407fb0aca11ad19a93b90a14b7c
Author: Andrew Kelley <superjoe30@gmail.com>
Date: Wed, 5 Sep 2018 10:43:35 -0400
stage1: fix crash when invalid type used in array type
closes #1186
Diffstat:
2 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/src/ir.cpp b/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;
diff --git a/test/compile_errors.zig b/test/compile_errors.zig
@@ -2,6 +2,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 {}
\\