diff options
| author | LemonBoy <thatlemon@gmail.com> | 2019-11-04 15:32:51 +0100 |
|---|---|---|
| committer | LemonBoy <thatlemon@gmail.com> | 2019-11-04 20:33:41 +0100 |
| commit | 9170dcb73f7b654cdf8447452240c3bf8d3de838 (patch) | |
| tree | fe6034d34611d92450d6754b37e20db6f7087107 /src/ir.cpp | |
| parent | c47211cc60a826837191fbb87b32f0baacb167cb (diff) | |
| download | zig-9170dcb73f7b654cdf8447452240c3bf8d3de838.tar.gz zig-9170dcb73f7b654cdf8447452240c3bf8d3de838.zip | |
Fix #3558
Finding a suitable test case is left as an exercise to the reader.
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 211af9a758..35ef2b98e2 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -11297,7 +11297,10 @@ static ZigFn *ir_resolve_fn(IrAnalyze *ira, IrInstruction *fn_value) { if (!const_val) return nullptr; - assert(const_val->data.x_ptr.special == ConstPtrSpecialFunction); + // May be a ConstPtrSpecialHardCodedAddr + if (const_val->data.x_ptr.special != ConstPtrSpecialFunction) + return nullptr; + return const_val->data.x_ptr.data.fn.fn_entry; } @@ -16737,9 +16740,8 @@ static IrInstruction *ir_analyze_instruction_call(IrAnalyze *ira, IrInstructionC return ir_finish_anal(ira, cast_instruction); } else if (fn_ref->value.type->id == ZigTypeIdFn) { ZigFn *fn_table_entry = ir_resolve_fn(ira, fn_ref); - if (fn_table_entry == nullptr) - return ira->codegen->invalid_instruction; - return ir_analyze_fn_call(ira, call_instruction, fn_table_entry, fn_table_entry->type_entry, + ZigType *fn_type = fn_table_entry ? fn_table_entry->type_entry : fn_ref->value.type; + return ir_analyze_fn_call(ira, call_instruction, fn_table_entry, fn_type, fn_ref, nullptr, is_comptime, call_instruction->fn_inline); } else if (fn_ref->value.type->id == ZigTypeIdBoundFn) { assert(fn_ref->value.special == ConstValSpecialStatic); @@ -16756,7 +16758,7 @@ static IrInstruction *ir_analyze_instruction_call(IrAnalyze *ira, IrInstructionC if (fn_ref->value.type->id == ZigTypeIdFn) { return ir_analyze_fn_call(ira, call_instruction, nullptr, fn_ref->value.type, - fn_ref, nullptr, false, FnInlineAuto); + fn_ref, nullptr, false, call_instruction->fn_inline); } else { ir_add_error_node(ira, fn_ref->source_node, buf_sprintf("type '%s' not a function", buf_ptr(&fn_ref->value.type->name))); |
