diff --git a/main.v b/main.v new file mode 100644 index 0000000000..a6ecd7a2ba --- /dev/null +++ b/main.v @@ -0,0 +1,7 @@ +fn main() { + list := [1,2,3].filter(stringsss(it)) +} + +fn stringsss(arg int) string { + return '' +} \ No newline at end of file diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index eb42ffd7c3..31f06d7067 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1409,6 +1409,13 @@ fn (mut c Checker) check_map_and_filter(is_map bool, elem_typ ast.Type, call_exp } } } + ast.CallExpr { + if is_map && arg_expr.return_type == table.void_type { + c.error('type mismatch, `$arg_expr.name` does not return anything', arg_expr.pos) + } else if !is_map && arg_expr.return_type != table.bool_type { + c.error('type mismatch, `$arg_expr.name` must return a bool', arg_expr.pos) + } + } else {} } } diff --git a/vlib/v/checker/tests/filter_func_return_nonbool_err.out b/vlib/v/checker/tests/filter_func_return_nonbool_err.out new file mode 100644 index 0000000000..e62f5db75f --- /dev/null +++ b/vlib/v/checker/tests/filter_func_return_nonbool_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/filter_func_return_nonbool_err.vv:2:25: error: type mismatch, `stringsss` must return a bool + 1 | fn main() { + 2 | list := [1,2,3].filter(stringsss(it)) + | ~~~~~~~~~~~~~ + 3 | } + 4 | diff --git a/vlib/v/checker/tests/filter_func_return_nonbool_err.vv b/vlib/v/checker/tests/filter_func_return_nonbool_err.vv new file mode 100644 index 0000000000..a6ecd7a2ba --- /dev/null +++ b/vlib/v/checker/tests/filter_func_return_nonbool_err.vv @@ -0,0 +1,7 @@ +fn main() { + list := [1,2,3].filter(stringsss(it)) +} + +fn stringsss(arg int) string { + return '' +} \ No newline at end of file diff --git a/vlib/v/checker/tests/map_func_void_return_err.out b/vlib/v/checker/tests/map_func_void_return_err.out new file mode 100644 index 0000000000..943e7b153e --- /dev/null +++ b/vlib/v/checker/tests/map_func_void_return_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/map_func_void_return_err.vv:2:22: error: type mismatch, `voids` does not return anything + 1 | fn main() { + 2 | list := [1,2,3].map(voids(it)) + | ~~~~~~~~~ + 3 | } + 4 | diff --git a/vlib/v/checker/tests/map_func_void_return_err.vv b/vlib/v/checker/tests/map_func_void_return_err.vv new file mode 100644 index 0000000000..bd5446e128 --- /dev/null +++ b/vlib/v/checker/tests/map_func_void_return_err.vv @@ -0,0 +1,7 @@ +fn main() { + list := [1,2,3].map(voids(it)) +} + +fn voids(arg int) { + println(arg) +}