Skip to content

Commit 19ca0d0

Browse files
authored
checker: fix multi return var passing to fn arg (potential fix for #24870) (#25250)
1 parent 84f6816 commit 19ca0d0

3 files changed

Lines changed: 36 additions & 0 deletions

File tree

‎vlib/v/checker/fn.v‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,6 +1685,16 @@ fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) ast.
16851685
return ast.void_type
16861686
}
16871687
}
1688+
if !func.is_variadic && func.params.len < (param_i + arg_typ_sym.info.types.len) {
1689+
c.fn_call_error_have_want(
1690+
nr_params: func.params.len
1691+
nr_args: param_i + arg_typ_sym.info.types.len
1692+
params: func.params
1693+
args: node.args
1694+
pos: node.pos
1695+
)
1696+
return ast.void_type
1697+
}
16881698
out: for n in 0 .. arg_typ_sym.info.types.len {
16891699
curr_arg := arg_typs[n]
16901700
multi_param := if func.is_variadic && i >= func.params.len - 1 {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
vlib/v/checker/tests/fn_call_arg_multi_err.vv:9:7: error: assignment mismatch: 1 variable but `a()` returns 2 values
2+
7 |
3+
8 | fn main() {
4+
9 | rets := a()
5+
| ~~
6+
10 | b(1, rets)
7+
11 | }
8+
vlib/v/checker/tests/fn_call_arg_multi_err.vv:10:2: error: expected 2 arguments, but got 3
9+
8 | fn main() {
10+
9 | rets := a()
11+
10 | b(1, rets)
12+
| ~~~~~~~~~~
13+
11 | }
14+
Details: have (int literal, (int, int))
15+
want (int, []int)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
fn a() (int, int) {
2+
return 1, 1
3+
}
4+
5+
fn b(w int, arg []int) {
6+
}
7+
8+
fn main() {
9+
rets := a()
10+
b(1, rets)
11+
}

0 commit comments

Comments
 (0)