diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 00306e568b..7b7fd22dd8 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2104,6 +2104,11 @@ pub fn (mut c Checker) fn_call(mut call_expr ast.CallExpr) ast.Type { for generic_type in call_expr.generic_types { c.ensure_type_exists(generic_type, call_expr.generic_list_pos) or {} } + if func.generic_names.len > 0 && call_expr.args.len == 0 && call_expr.generic_types.len == 0 { + c.error('no argument generic function must add concrete types, e.g. foo()', + call_expr.pos) + return func.return_type + } if func.generic_names.len > 0 && func.return_type.has_flag(.generic) { c.check_return_generics_struct(func.return_type, mut call_expr, generic_types) } else { diff --git a/vlib/v/checker/tests/generics_fn_called_no_arg_err.out b/vlib/v/checker/tests/generics_fn_called_no_arg_err.out new file mode 100644 index 0000000000..42128086fc --- /dev/null +++ b/vlib/v/checker/tests/generics_fn_called_no_arg_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/generics_fn_called_no_arg_err.vv:13:10: error: no argument generic function must add concrete types, e.g. foo() + 11 | + 12 | fn main() { + 13 | q := new_queue() + | ~~~~~~~~~~~ + 14 | println(q) + 15 | } diff --git a/vlib/v/checker/tests/generics_fn_called_no_arg_err.vv b/vlib/v/checker/tests/generics_fn_called_no_arg_err.vv new file mode 100644 index 0000000000..a05e1d57df --- /dev/null +++ b/vlib/v/checker/tests/generics_fn_called_no_arg_err.vv @@ -0,0 +1,15 @@ +struct Queue{ + buffer []T +} + +fn new_queue() Queue { + q := Queue{ + buffer: []T{cap: 1024} + } + return q +} + +fn main() { + q := new_queue() + println(q) +}