authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-11-04 15:32:51+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-11-04 20:33:41+01:00
log9170dcb73f7b654cdf8447452240c3bf8d3de838
treefe6034d34611d92450d6754b37e20db6f7087107
parentc47211cc60a826837191fbb87b32f0baacb167cb

Fix #3558

Finding a suitable test case is left as an exercise to the reader.

1 files changed, 7 insertions(+), 5 deletions(-)

src/ir.cpp+7-5
......@@ -11297,7 +11297,10 @@ static ZigFn *ir_resolve_fn(IrAnalyze *ira, IrInstruction *fn_value) {
1129711297 if (!const_val)
1129811298 return nullptr;
1129911299
11300 assert(const_val->data.x_ptr.special == ConstPtrSpecialFunction);
11300 // May be a ConstPtrSpecialHardCodedAddr
11301 if (const_val->data.x_ptr.special != ConstPtrSpecialFunction)
11302 return nullptr;
11303
1130111304 return const_val->data.x_ptr.data.fn.fn_entry;
1130211305}
1130311306
......@@ -16737,9 +16740,8 @@ static IrInstruction *ir_analyze_instruction_call(IrAnalyze *ira, IrInstructionC
1673716740 return ir_finish_anal(ira, cast_instruction);
1673816741 } else if (fn_ref->value.type->id == ZigTypeIdFn) {
1673916742 ZigFn *fn_table_entry = ir_resolve_fn(ira, fn_ref);
16740 if (fn_table_entry == nullptr)
16741 return ira->codegen->invalid_instruction;
16742 return ir_analyze_fn_call(ira, call_instruction, fn_table_entry, fn_table_entry->type_entry,
16743 ZigType *fn_type = fn_table_entry ? fn_table_entry->type_entry : fn_ref->value.type;
16744 return ir_analyze_fn_call(ira, call_instruction, fn_table_entry, fn_type,
1674316745 fn_ref, nullptr, is_comptime, call_instruction->fn_inline);
1674416746 } else if (fn_ref->value.type->id == ZigTypeIdBoundFn) {
1674516747 assert(fn_ref->value.special == ConstValSpecialStatic);
......@@ -16756,7 +16758,7 @@ static IrInstruction *ir_analyze_instruction_call(IrAnalyze *ira, IrInstructionC
1675616758
1675716759 if (fn_ref->value.type->id == ZigTypeIdFn) {
1675816760 return ir_analyze_fn_call(ira, call_instruction, nullptr, fn_ref->value.type,
16759 fn_ref, nullptr, false, FnInlineAuto);
16761 fn_ref, nullptr, false, call_instruction->fn_inline);
1676016762 } else {
1676116763 ir_add_error_node(ira, fn_ref->source_node,
1676216764 buf_sprintf("type '%s' not a function", buf_ptr(&fn_ref->value.type->name)));