authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-19 11:22:57-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-19 11:22:57-05:00
log2f5d1ec5006ccae81f6de80233fa7800237779e2
tree719a681a4d2281fa29376643e1506bf1dbcbae5e
parent81d9403dcea172ce2fdb44610c9350821109adae
signature Commit is signed but in an unrecognized format.

improve error message when wrong type returned

closes #1650

2 files changed, 8 insertions(+), 1 deletions(-)

src/ir.cpp+7-1
......@@ -34,6 +34,7 @@ struct IrAnalyze {
3434 size_t old_bb_index;
3535 size_t instruction_index;
3636 ZigType *explicit_return_type;
37 AstNode *explicit_return_type_source_node;
3738 ZigList<IrInstruction *> src_implicit_return_type_list;
3839 IrBasicBlock *const_predecessor_bb;
3940};
......@@ -11162,8 +11163,12 @@ static IrInstruction *ir_analyze_instruction_return(IrAnalyze *ira, IrInstructio
1116211163 return ir_unreach_error(ira);
1116311164
1116411165 IrInstruction *casted_value = ir_implicit_cast(ira, value, ira->explicit_return_type);
11165 if (type_is_invalid(casted_value->value.type))
11166 if (type_is_invalid(casted_value->value.type) && ira->explicit_return_type_source_node != nullptr) {
11167 ErrorMsg *msg = ira->codegen->errors.last();
11168 add_error_note(ira->codegen, msg, ira->explicit_return_type_source_node,
11169 buf_sprintf("return type declared here"));
1116611170 return ir_unreach_error(ira);
11171 }
1116711172
1116811173 if (casted_value->value.special == ConstValSpecialRuntime &&
1116911174 casted_value->value.type->id == ZigTypeIdPointer &&
......@@ -21213,6 +21218,7 @@ ZigType *ir_analyze(CodeGen *codegen, IrExecutable *old_exec, IrExecutable *new_
2121321218 ZigFn *fn_entry = exec_fn_entry(old_exec);
2121421219 bool is_async = fn_entry != nullptr && fn_entry->type_entry->data.fn.fn_type_id.cc == CallingConventionAsync;
2121521220 ira->explicit_return_type = is_async ? get_promise_type(codegen, expected_type) : expected_type;
21221 ira->explicit_return_type_source_node = expected_type_source_node;
2121621222
2121721223 ira->old_irb.codegen = codegen;
2121821224 ira->old_irb.exec = old_exec;
test/compile_errors.zig+1
......@@ -3219,6 +3219,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
32193219 \\fn something() anyerror!void { }
32203220 ,
32213221 ".tmp_source.zig:2:5: error: expected type 'void', found 'anyerror'",
3222 ".tmp_source.zig:1:15: note: return type declared here",
32223223 );
32233224
32243225 cases.add(