diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index e6230a224c..f5ed8705de 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -1543,8 +1543,11 @@ fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) ast. } } arg_typ_sym := c.table.sym(arg_typ) - if arg_typ_sym.kind == .none && param.typ.has_flag(.generic) && !param.typ.has_flag(.option) { - c.error('cannot use `none` as generic argument', call_arg.pos) + if param.typ.has_flag(.generic) { + if arg_typ_sym.kind == .none && !param.typ.has_flag(.option) { + c.error('cannot use `none` as generic argument', call_arg.pos) + } + c.check_unresolved_generic_param(node, call_arg) } param_typ_sym := c.table.sym(param.typ) if func.is_variadic && arg_typ.has_flag(.variadic) && args_len - 1 > i { @@ -2573,6 +2576,7 @@ fn (mut c Checker) method_call(mut node ast.CallExpr, mut continue_check &bool) } } if exp_arg_typ.has_flag(.generic) { + c.check_unresolved_generic_param(node, arg) method_concrete_types := if method_generic_names_len == rec_concrete_types.len { rec_concrete_types } else { @@ -2753,6 +2757,13 @@ fn (mut c Checker) handle_generic_lambda_arg(node &ast.CallExpr, mut lambda ast. } } +fn (mut c Checker) check_unresolved_generic_param(node &ast.CallExpr, arg ast.CallArg) { + if node.raw_concrete_types.len == 0 && arg.expr is ast.ArrayInit + && arg.expr.typ == ast.void_type { + c.error('cannot use empty array as generic argument', arg.pos) + } +} + fn (mut c Checker) spawn_expr(mut node ast.SpawnExpr) ast.Type { ret_type := c.call_expr(mut node.call_expr) if node.call_expr.or_block.kind != .absent { diff --git a/vlib/v/checker/tests/empty_arr_to_generic_param_err.out b/vlib/v/checker/tests/empty_arr_to_generic_param_err.out new file mode 100644 index 0000000000..95471d0934 --- /dev/null +++ b/vlib/v/checker/tests/empty_arr_to_generic_param_err.out @@ -0,0 +1,13 @@ +vlib/v/checker/tests/empty_arr_to_generic_param_err.vv:8:4: error: cannot use empty array as generic argument + 6 | + 7 | fn main() { + 8 | t([]) + | ~~ + 9 | Foo{}.t([]) + 10 | } +vlib/v/checker/tests/empty_arr_to_generic_param_err.vv:9:10: error: cannot use empty array as generic argument + 7 | fn main() { + 8 | t([]) + 9 | Foo{}.t([]) + | ~~ + 10 | } diff --git a/vlib/v/checker/tests/empty_arr_to_generic_param_err.vv b/vlib/v/checker/tests/empty_arr_to_generic_param_err.vv new file mode 100644 index 0000000000..ad91667872 --- /dev/null +++ b/vlib/v/checker/tests/empty_arr_to_generic_param_err.vv @@ -0,0 +1,10 @@ +fn t[T](a []T) {} + +struct Foo {} + +fn (t &Foo) t[T](a []T) {} + +fn main() { + t([]) + Foo{}.t([]) +}