diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 29849a089a..15238e7262 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -1173,12 +1173,10 @@ fn (mut g Gen) call_args(node ast.CallExpr) { mut arr_info := arr_sym.info as ast.Array if varg_type.has_flag(.generic) { if fn_def := g.table.find_fn(node.name) { - varg_type_name := g.table.type_to_str(varg_type) - for i, fn_gen_name in fn_def.generic_names { - if fn_gen_name == varg_type_name { - arr_info.elem_type = node.concrete_types[i] - break - } + if utyp := g.table.resolve_generic_to_concrete(arr_info.elem_type, fn_def.generic_names, + node.concrete_types) + { + arr_info.elem_type = utyp } } else { g.error('unable to find function $node.name', node.pos) diff --git a/vlib/v/tests/generics_with_variadic_generic_args_test.v b/vlib/v/tests/generics_with_variadic_generic_args_test.v new file mode 100644 index 0000000000..1023451ab6 --- /dev/null +++ b/vlib/v/tests/generics_with_variadic_generic_args_test.v @@ -0,0 +1,31 @@ +struct Node { +mut: + data T + next &Node = 0 +} + +struct SinglyLinkedList { +mut: + first_node &Node = 0 +} + +fn init_singlylinkedlist(nodes ...Node) SinglyLinkedList { + mut current_node := &nodes[0] + + for i in 0 .. nodes.len - 1 { + current_node = &nodes[i] + current_node.next = &nodes[i + 1] + } + + return SinglyLinkedList{&nodes[0]} +} + +fn test_generic_with_variadic_generic_args() { + sll := init_singlylinkedlist(Node{ data: 1 }, Node{ + data: 2 + }, Node{ + data: 798 + }) + println(sll.first_node.next) + assert sll.first_node.next.data == 2 +}