zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
Msrc/ir.cpp | 4++++
Mtest/compile_errors.zig | 13+++++++++++++
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 {} \\