mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
cgen: fix spawn method on generic struct (#17691)
This commit is contained in:
@ -1918,7 +1918,7 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if expr.is_method {
|
if expr.is_method {
|
||||||
receiver_sym := g.table.sym(expr.receiver_type)
|
receiver_sym := g.table.sym(g.unwrap_generic(expr.receiver_type))
|
||||||
name = receiver_sym.cname + '_' + name
|
name = receiver_sym.cname + '_' + name
|
||||||
} else if mut expr.left is ast.AnonFn {
|
} else if mut expr.left is ast.AnonFn {
|
||||||
if expr.left.inherited_vars.len > 0 {
|
if expr.left.inherited_vars.len > 0 {
|
||||||
@ -2096,8 +2096,8 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
|
|||||||
fn_var = g.fn_var_signature(f.return_type, f.params.map(it.typ), 'fn')
|
fn_var = g.fn_var_signature(f.return_type, f.params.map(it.typ), 'fn')
|
||||||
} else {
|
} else {
|
||||||
if node.call_expr.is_method {
|
if node.call_expr.is_method {
|
||||||
rec_sym := g.table.sym(node.call_expr.receiver_type)
|
rec_sym := g.table.sym(g.unwrap_generic(node.call_expr.receiver_type))
|
||||||
if f := g.table.find_method(rec_sym, node.call_expr.name) {
|
if f := rec_sym.find_method_with_generic_parent(node.call_expr.name) {
|
||||||
mut muttable := unsafe { &ast.Table(g.table) }
|
mut muttable := unsafe { &ast.Table(g.table) }
|
||||||
return_type := muttable.resolve_generic_to_concrete(f.return_type,
|
return_type := muttable.resolve_generic_to_concrete(f.return_type,
|
||||||
f.generic_names, node.call_expr.concrete_types) or { f.return_type }
|
f.generic_names, node.call_expr.concrete_types) or { f.return_type }
|
||||||
|
25
vlib/v/tests/spawn_method_on_generic_struct_test.v
Normal file
25
vlib/v/tests/spawn_method_on_generic_struct_test.v
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
struct Gen[T] {
|
||||||
|
data T
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (g Gen[T]) process() string {
|
||||||
|
th := spawn g.internal()
|
||||||
|
r := th.wait()
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (g Gen[T]) internal() string {
|
||||||
|
println(g.data * g.data)
|
||||||
|
return '${g.data * g.data}'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_spawn_method_on_generic_struct() {
|
||||||
|
g := Gen[int]{
|
||||||
|
data: 5
|
||||||
|
}
|
||||||
|
r1 := g.process()
|
||||||
|
assert r1 == '25'
|
||||||
|
|
||||||
|
r2 := g.internal()
|
||||||
|
assert r2 == '25'
|
||||||
|
}
|
Reference in New Issue
Block a user