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'
+}