diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 90cba0a0f3..bec726f3df 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -303,6 +303,10 @@ pub fn (c mut Checker) return_stmt(return_stmt ast.Return) { mr_info := expected_type_sym.info as table.MultiReturn expected_types = mr_info.types } + // allow `none` & `error (Option)` return types for function that returns optional + if exp_is_optional && table.type_idx(got_types[0]) in [table.none_type_idx, c.table.type_idxs['Option']] { + return + } if expected_types.len > 0 && expected_types.len != got_types.len { c.error('wrong number of return arguments:\n\texpected: $expected_types.str()\n\tgot: $got_types.str()', return_stmt.pos) } @@ -311,9 +315,6 @@ pub fn (c mut Checker) return_stmt(return_stmt ast.Return) { if !c.table.check(got_typ, exp_typ) { got_typ_sym := c.table.get_type_symbol(got_typ) exp_typ_sym := c.table.get_type_symbol(exp_typ) - if got_typ_sym.name == 'Option' && exp_is_optional { - continue - } c.error('cannot use `$got_typ_sym.name` as type `$exp_typ_sym.name` in return argument', return_stmt.pos) } } diff --git a/vlib/v/table/types.v b/vlib/v/table/types.v index cd1d2174ed..f7af950f99 100644 --- a/vlib/v/table/types.v +++ b/vlib/v/table/types.v @@ -139,8 +139,8 @@ pub const ( f64_type = new_type(f64_type_idx) char_type = new_type(char_type_idx) bool_type = new_type(bool_type_idx) + none_type = new_type(none_type_idx) string_type = new_type(string_type_idx) array_type = new_type(array_type_idx) map_type = new_type(map_type_idx) - none_type = new_type(none_type_idx) )