diff --git a/vlib/compiler/fn.v b/vlib/compiler/fn.v index 4a2963803b..1fc83dccc3 100644 --- a/vlib/compiler/fn.v +++ b/vlib/compiler/fn.v @@ -1308,6 +1308,8 @@ fn (p mut Parser) fn_call_args(f mut Fn, generic_param_types []string) { p.check(.comma) p.fspace() p.gen(',') + } else if p.tok != .comma { + p.gen(',') } } } @@ -1499,9 +1501,17 @@ fn (p mut Parser) fn_call_vargs(f Fn) (string,[]string) { p.error_with_token_index('variadic arg index out of range: $va.index/${values.len-1}, vargs are 0 indexed', va.tok_idx) } } - if !f.is_method && f.args.len > 1 { + + if types.len == 0 { + return last_arg.typ,[]string + } + + insert_comma_after_arg := if f.is_method { 2 } else { 1 } + + if f.args.len > insert_comma_after_arg { p.cgen.gen(',') } + return types[0],values } @@ -1509,7 +1519,12 @@ fn (p mut Parser) fn_gen_caller_vargs(f &Fn, varg_type string, values []string) is_varg := varg_type.starts_with('varg_') if is_varg { // forwarding varg - p.cgen.gen('${values[0]}') + if values.len == 0 { + vargs_struct := p.register_vargs_stuct(varg_type, 1) + p.cgen.gen('&($vargs_struct){.len=0}') + } else { + p.cgen.gen('${values[0]}') + } } else { vargs_struct := p.register_vargs_stuct(varg_type, values.len) diff --git a/vlib/compiler/tests/fn_variadic_test.v b/vlib/compiler/tests/fn_variadic_test.v index 4c0c68552e..e3b59f93b6 100644 --- a/vlib/compiler/tests/fn_variadic_test.v +++ b/vlib/compiler/tests/fn_variadic_test.v @@ -41,3 +41,36 @@ fn variadic_forward_b(a ...string) string { fn test_fn_variadic_forward() { assert variadic_forward_a('a', 'b', 'c') == 'abc' } + +fn variadic_test_no_args(name string, groups ...VaTestGroup) { + assert groups.len == 0 +} + +fn test_fn_variadic_no_args() { + variadic_test_no_args('marko') +} + +struct VaTestStruct { +} + +fn (a VaTestStruct) variadic_method(name string, groups ...VaTestGroup) { + assert groups.len == 2 + assert groups[0].name == 'users' + assert groups[1].name == 'admins' +} + +fn (a VaTestStruct) variadic_method_no_args(name string, groups ...VaTestGroup) { + assert groups.len == 0 +} + +fn test_fn_variadic_method() { + a := VaTestStruct{} + group1 := VaTestGroup{name: 'users'} + group2 := VaTestGroup{name: 'admins'} + a.variadic_method('marko', group1, group2) +} + +fn test_fn_variadic_method_no_args() { + a := VaTestStruct{} + a.variadic_method_no_args('marko') +}