| ... | @@ -4771,38 +4771,41 @@ static void analyze_fn_ir(CodeGen *g, ZigFn *fn, AstNode *return_type_node) { | ... | @@ -4771,38 +4771,41 @@ static void analyze_fn_ir(CodeGen *g, ZigFn *fn, AstNode *return_type_node) { |
| 4771 | if (return_err_set_type->data.error_set.infer_fn != nullptr && | 4771 | if (return_err_set_type->data.error_set.infer_fn != nullptr && |
| 4772 | return_err_set_type->data.error_set.incomplete) | 4772 | return_err_set_type->data.error_set.incomplete) |
| 4773 | { | 4773 | { |
| 4774 | ZigType *inferred_err_set_type; | 4774 | // The inferred error set type is null if the function doesn't |
| | 4775 | // return any error |
| | 4776 | ZigType *inferred_err_set_type = nullptr; |
| | 4777 | |
| 4775 | if (fn->src_implicit_return_type->id == ZigTypeIdErrorSet) { | 4778 | if (fn->src_implicit_return_type->id == ZigTypeIdErrorSet) { |
| 4776 | inferred_err_set_type = fn->src_implicit_return_type; | 4779 | inferred_err_set_type = fn->src_implicit_return_type; |
| 4777 | } else if (fn->src_implicit_return_type->id == ZigTypeIdErrorUnion) { | 4780 | } else if (fn->src_implicit_return_type->id == ZigTypeIdErrorUnion) { |
| 4778 | inferred_err_set_type = fn->src_implicit_return_type->data.error_union.err_set_type; | 4781 | inferred_err_set_type = fn->src_implicit_return_type->data.error_union.err_set_type; |
| 4779 | } else { | | |
| 4780 | add_node_error(g, return_type_node, | | |
| 4781 | buf_sprintf("function with inferred error set must return at least one possible error")); | | |
| 4782 | fn->anal_state = FnAnalStateInvalid; | | |
| 4783 | return; | | |
| 4784 | } | 4782 | } |
| 4785 | | 4783 | |
| 4786 | if (inferred_err_set_type->data.error_set.infer_fn != nullptr && | 4784 | if (inferred_err_set_type != nullptr) { |
| 4787 | inferred_err_set_type->data.error_set.incomplete) | 4785 | if (inferred_err_set_type->data.error_set.infer_fn != nullptr && |
| 4788 | { | 4786 | inferred_err_set_type->data.error_set.incomplete) |
| 4789 | if (!resolve_inferred_error_set(g, inferred_err_set_type, return_type_node)) { | 4787 | { |
| 4790 | fn->anal_state = FnAnalStateInvalid; | 4788 | if (!resolve_inferred_error_set(g, inferred_err_set_type, return_type_node)) { |
| 4791 | return; | 4789 | fn->anal_state = FnAnalStateInvalid; |
| | 4790 | return; |
| | 4791 | } |
| 4792 | } | 4792 | } |
| 4793 | } | | |
| 4794 | | 4793 | |
| 4795 | return_err_set_type->data.error_set.incomplete = false; | 4794 | return_err_set_type->data.error_set.incomplete = false; |
| 4796 | if (type_is_global_error_set(inferred_err_set_type)) { | 4795 | if (type_is_global_error_set(inferred_err_set_type)) { |
| 4797 | return_err_set_type->data.error_set.err_count = UINT32_MAX; | 4796 | return_err_set_type->data.error_set.err_count = UINT32_MAX; |
| 4798 | } else { | 4797 | } else { |
| 4799 | return_err_set_type->data.error_set.err_count = inferred_err_set_type->data.error_set.err_count; | 4798 | return_err_set_type->data.error_set.err_count = inferred_err_set_type->data.error_set.err_count; |
| 4800 | if (inferred_err_set_type->data.error_set.err_count > 0) { | 4799 | if (inferred_err_set_type->data.error_set.err_count > 0) { |
| 4801 | return_err_set_type->data.error_set.errors = heap::c_allocator.allocate<ErrorTableEntry *>(inferred_err_set_type->data.error_set.err_count); | 4800 | return_err_set_type->data.error_set.errors = heap::c_allocator.allocate<ErrorTableEntry *>(inferred_err_set_type->data.error_set.err_count); |
| 4802 | for (uint32_t i = 0; i < inferred_err_set_type->data.error_set.err_count; i += 1) { | 4801 | for (uint32_t i = 0; i < inferred_err_set_type->data.error_set.err_count; i += 1) { |
| 4803 | return_err_set_type->data.error_set.errors[i] = inferred_err_set_type->data.error_set.errors[i]; | 4802 | return_err_set_type->data.error_set.errors[i] = inferred_err_set_type->data.error_set.errors[i]; |
| | 4803 | } |
| 4804 | } | 4804 | } |
| 4805 | } | 4805 | } |
| | 4806 | } else { |
| | 4807 | return_err_set_type->data.error_set.incomplete = false; |
| | 4808 | return_err_set_type->data.error_set.err_count = 0; |
| 4806 | } | 4809 | } |
| 4807 | } | 4810 | } |
| 4808 | } | 4811 | } |