diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index d2073cdd0f..63f5706f18 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2227,13 +2227,15 @@ pub fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type { concrete_types = node.concrete_types } // resolve return generics struct to concrete type - if method.generic_names.len > 0 && method.return_type.has_flag(.generic) { + if method.generic_names.len > 0 && method.return_type.has_flag(.generic) + && c.table.cur_fn.generic_names.len == 0 { node.return_type = c.table.unwrap_generic_type(method.return_type, method.generic_names, concrete_types) } else { node.return_type = method.return_type } - if node.concrete_types.len > 0 && method.return_type != 0 { + if node.concrete_types.len > 0 && method.return_type != 0 + && c.table.cur_fn.generic_names.len == 0 { if typ := c.table.resolve_generic_to_concrete(method.return_type, method.generic_names, concrete_types) { diff --git a/vlib/v/tests/generics_with_nested_generics_method_call_assign_test.v b/vlib/v/tests/generics_with_nested_generics_method_call_assign_test.v new file mode 100644 index 0000000000..99c3c108bf --- /dev/null +++ b/vlib/v/tests/generics_with_nested_generics_method_call_assign_test.v @@ -0,0 +1,24 @@ +struct SSS { +mut: + x T +} + +fn (s SSS) inner() T { + return s.x +} + +fn (s SSS) outer() string { + ret := s.inner() + println(ret) + return '$ret' +} + +fn test_generics_with_nested_generic_method_call_assign() { + s1 := SSS{100} + s1.outer() + assert s1.outer() == '100' + + s2 := SSS{'hello'} + s2.outer() + assert s2.outer() == 'hello' +}