From 42e582804e0b5bcbb0c7c7ea062d486f811952bc Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 2 Sep 2022 02:24:24 +0800 Subject: [PATCH] checker: check fn variadic passing arg error (fix #15629) (#15632) --- vlib/v/checker/fn.v | 9 +++++++++ vlib/v/checker/tests/fn_variadic_arg_err.out | 7 +++++++ vlib/v/checker/tests/fn_variadic_arg_err.vv | 10 ++++++++++ 3 files changed, 26 insertions(+) create mode 100644 vlib/v/checker/tests/fn_variadic_arg_err.out create mode 100644 vlib/v/checker/tests/fn_variadic_arg_err.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 09932267b..8a65f20d4 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -872,6 +872,15 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) info := param_sym.array_info() c.expected_type = info.elem_type } + typ := c.expr(call_arg.expr) + if i == node.args.len - 1 && c.table.sym(typ).kind == .array + && call_arg.expr !is ast.ArrayDecompose && !param.typ.has_flag(.generic) + && c.expected_type != typ { + styp := c.table.type_to_str(typ) + elem_styp := c.table.type_to_str(c.expected_type) + c.error('to pass `$call_arg.expr` ($styp) to `$func.name` (which accepts type `...$elem_styp`), use `...$call_arg.expr`', + node.pos) + } } else { c.expected_type = param.typ } diff --git a/vlib/v/checker/tests/fn_variadic_arg_err.out b/vlib/v/checker/tests/fn_variadic_arg_err.out new file mode 100644 index 000000000..5030413ba --- /dev/null +++ b/vlib/v/checker/tests/fn_variadic_arg_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/fn_variadic_arg_err.vv:5:2: error: to pass `a` ([]u8) to `varg_fn_a` (which accepts type `...u8`), use `...a` + 3 | fn main() { + 4 | a := [u8(1), 2, 3, 4] + 5 | varg_fn_a(a) + | ~~~~~~~~~~~~ + 6 | } + 7 | diff --git a/vlib/v/checker/tests/fn_variadic_arg_err.vv b/vlib/v/checker/tests/fn_variadic_arg_err.vv new file mode 100644 index 000000000..2ee810da7 --- /dev/null +++ b/vlib/v/checker/tests/fn_variadic_arg_err.vv @@ -0,0 +1,10 @@ +module main + +fn main() { + a := [u8(1), 2, 3, 4] + varg_fn_a(a) +} + +fn varg_fn_a(b ...u8) { + println(b) +} -- 2.30.2