diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index a0823f4fae..e5c225831b 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1434,9 +1434,18 @@ fn (mut c Checker) check_return_generics_struct(return_type ast.Type, mut call_e rts := c.table.get_type_symbol(return_type) if rts.info is ast.Struct { if rts.info.generic_types.len > 0 { - gts := c.table.get_type_symbol(call_expr.generic_types[0]) - nrt := '$rts.name<$gts.name>' - c_nrt := '${rts.name}_T_$gts.name' + mut nrt := '$rts.name<' + mut c_nrt := '${rts.name}_T_' + for i in 0 .. call_expr.generic_types.len { + gts := c.table.get_type_symbol(call_expr.generic_types[i]) + nrt += gts.name + c_nrt += gts.name + if i != call_expr.generic_types.len - 1 { + nrt += ',' + c_nrt += '_' + } + } + nrt += '>' idx := c.table.type_idxs[nrt] if idx != 0 { c.ensure_type_exists(idx, call_expr.pos) or {} diff --git a/vlib/v/tests/generics_return_multiple_generics_struct_test.v b/vlib/v/tests/generics_return_multiple_generics_struct_test.v new file mode 100644 index 0000000000..3485288616 --- /dev/null +++ b/vlib/v/tests/generics_return_multiple_generics_struct_test.v @@ -0,0 +1,38 @@ +struct Foo { +mut: + a A + b B +} + +fn new_foo(a A, b B) Foo { + return { + a: a + b: b + } +} + +fn get_a(opt Foo) A { + return opt.a +} + +fn get_b(opt Foo) B { + return opt.b +} + +fn set(mut opt Foo, a A, b B) { + opt.a = a + opt.b = b +} + +fn test_generics_return_multiple_generics_struct() { + mut o := new_foo(23, 'aaa') + println(get_a(o)) + assert get_a(o) == 23 + println(get_b(o)) + assert get_b(o) == 'aaa' + set(mut o, 42, 'bbb') + println(get_a(o)) + assert get_a(o) == 42 + println(get_b(o)) + assert get_b(o) == 'bbb' +}