v.checker: fix `a.map(voidfn(it))` (#10985)

pull/10990/head
yuyi 2021-07-29 16:43:56 +08:00 committed by GitHub
parent 75c41252d9
commit 57f30668e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 1 deletions

View File

@ -1985,7 +1985,7 @@ 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 == ast.void_type {
if is_map && arg_expr.return_type in [ast.void_type, 0] {
c.error('type mismatch, `$arg_expr.name` does not return anything', arg_expr.pos)
} else if !is_map && arg_expr.return_type != ast.bool_type {
c.error('type mismatch, `$arg_expr.name` must return a bool', arg_expr.pos)
@ -2767,6 +2767,7 @@ pub fn (mut c Checker) fn_call(mut call_expr ast.CallExpr) ast.Type {
}
c.fail_if_unreadable(arg.expr, arg.typ, 'argument to print')
c.inside_println_arg = false
call_expr.return_type = ast.void_type
/*
// TODO: optimize `struct T{} fn (t &T) str() string {return 'abc'} mut a := []&T{} a << &T{} println(a[0])`
// It currently generates:

View File

@ -0,0 +1,6 @@
vlib/v/checker/tests/array_map_void_fn_err.vv:3:12: error: type mismatch, `println` does not return anything
1 | fn main(){
2 | array := [1,2,3,4]
3 | array.map(println(it))
| ~~~~~~~~~~~
4 | }

View File

@ -0,0 +1,4 @@
fn main(){
array := [1,2,3,4]
array.map(println(it))
}