From df1ec9135a059593c3bc3022f8f73d6da624b064 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 14 Apr 2025 05:01:18 -0300 Subject: [PATCH] cgen: fix variadic sumtype args passing (fix #24150) (#24207) --- vlib/v/gen/c/fn.v | 6 +++-- .../fns/call_args_variadic_sumtype_test.v | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/fns/call_args_variadic_sumtype_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index fd88cdbe02..40aebca4e0 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -2522,8 +2522,10 @@ fn (mut g Gen) call_args(node ast.CallExpr) { } } else { // passing variadic arg to another call which expects same array type - if args.len == 1 && args[arg_nr].typ.has_flag(.variadic) - && args[arg_nr].typ == varg_type { + if args.len == 1 + && ((args[arg_nr].typ.has_flag(.variadic) && args[arg_nr].typ == varg_type) + || (varg_type.has_flag(.variadic) + && args[arg_nr].typ == varg_type.clear_flag(.variadic))) { g.ref_or_deref_arg(args[arg_nr], arr_info.elem_type, node.language, false) } else { diff --git a/vlib/v/tests/fns/call_args_variadic_sumtype_test.v b/vlib/v/tests/fns/call_args_variadic_sumtype_test.v new file mode 100644 index 0000000000..4895872a2a --- /dev/null +++ b/vlib/v/tests/fns/call_args_variadic_sumtype_test.v @@ -0,0 +1,24 @@ +type Animal = Dog | Cat + +struct Dog { + name string +} + +struct Cat { + name string +} + +fn print_names(animals ...Animal) { + for animal in animals { + assert animal.name == 'Kitty' + } +} + +fn test_main() { + cat := Cat{ + name: 'Kitty' + } + mut animals := []Animal{} + animals << cat + print_names(animals) +}