Skip to content

Commit

Permalink
checker: add checker for passing multi return as arg to func that exp…
Browse files Browse the repository at this point in the history
…ects less param (fix #23735) (#23744)
  • Loading branch information
felipensp authored Feb 17, 2025
1 parent 55f482b commit 997ffdc
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
8 changes: 8 additions & 0 deletions vlib/v/checker/fn.v
Original file line number Diff line number Diff line change
Expand Up @@ -1631,6 +1631,14 @@ fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) ast.
}
} else if arg_typ_sym.info is ast.MultiReturn {
arg_typs := arg_typ_sym.info.types
if !(func.is_variadic && i >= func.params.len - 1) {
if arg_typ_sym.info.types.len > func.params.len {
c.error('trying to pass ${arg_typ_sym.info.types.len} argument(s), but function expects ${func.params.len} argument(s)',
node.pos)
continue_check = false
return ast.void_type
}
}
out: for n in 0 .. arg_typ_sym.info.types.len {
curr_arg := arg_typs[n]
multi_param := if func.is_variadic && i >= func.params.len - 1 {
Expand Down
14 changes: 14 additions & 0 deletions vlib/v/checker/tests/call_arg_multi_return_err.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
vlib/v/checker/tests/call_arg_multi_return_err.vv:6:6: error: assignment mismatch: 1 variable but `some_fn()` returns 2 values
4 |
5 | fn some_fn2() {
6 | ret := some_fn()
| ~~
7 | some_fn3(ret)
8 | }
vlib/v/checker/tests/call_arg_multi_return_err.vv:7:2: error: trying to pass 2 argument(s), but function expects 1 argument(s)
5 | fn some_fn2() {
6 | ret := some_fn()
7 | some_fn3(ret)
| ~~~~~~~~~~~~~
8 | }
9 |
10 changes: 10 additions & 0 deletions vlib/v/checker/tests/call_arg_multi_return_err.vv
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
fn some_fn() (int, int) {
return 0, 0
}

fn some_fn2() {
ret := some_fn()
some_fn3(ret)
}

fn some_fn3(param int) {}

0 comments on commit 997ffdc

Please sign in to comment.