Skip to content

Commit 639cbfa

Browse files
authored
checker: fix generics with assign nested generic fn call (#12366)
1 parent 0952af6 commit 639cbfa

3 files changed

Lines changed: 40 additions & 26 deletions

File tree

vlib/v/checker/checker.v

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2888,13 +2888,14 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool)
28882888
}
28892889
}
28902890
// resolve return generics struct to concrete type
2891-
if func.generic_names.len > 0 && func.return_type.has_flag(.generic) {
2891+
if func.generic_names.len > 0 && func.return_type.has_flag(.generic)
2892+
&& c.table.cur_fn.generic_names.len == 0 {
28922893
node.return_type = c.table.unwrap_generic_type(func.return_type, func.generic_names,
28932894
concrete_types)
28942895
} else {
28952896
node.return_type = func.return_type
28962897
}
2897-
if node.concrete_types.len > 0 && func.return_type != 0 {
2898+
if node.concrete_types.len > 0 && func.return_type != 0 && c.table.cur_fn.generic_names.len == 0 {
28982899
if typ := c.table.resolve_generic_to_concrete(func.return_type, func.generic_names,
28992900
concrete_types)
29002901
{
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
struct SSS<T> {
2+
mut:
3+
x T
4+
}
5+
6+
fn (s SSS<T>) inner() T {
7+
return s.x
8+
}
9+
10+
fn (s SSS<T>) outer() string {
11+
ret := s.inner<T>()
12+
println(ret)
13+
return '$ret'
14+
}
15+
16+
fn test_generics_with_assign_nested_generic_method_call() {
17+
s1 := SSS<int>{100}
18+
assert s1.outer() == '100'
19+
20+
s2 := SSS<string>{'hello'}
21+
assert s2.outer() == 'hello'
22+
}
23+
24+
fn fn_inner<T>(t T) T {
25+
return t
26+
}
27+
28+
fn fn_outer<T>(t T) string {
29+
ret := fn_inner<T>(t)
30+
println(ret)
31+
return '$ret'
32+
}
33+
34+
fn test_generics_with_assign_nested_generic_fn_call() {
35+
assert fn_outer(100) == '100'
36+
assert fn_outer('hello') == 'hello'
37+
}

vlib/v/tests/generics_with_nested_generics_method_call_assign_test.v

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)