1
0
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:
yuyi 2023-03-18 04:43:04 +08:00 committed by GitHub
parent 608c194325
commit 88ab947440
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 3 deletions

View File

@ -1918,7 +1918,7 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
}
}
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
} else if mut expr.left is ast.AnonFn {
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')
} else {
if node.call_expr.is_method {
rec_sym := g.table.sym(node.call_expr.receiver_type)
if f := g.table.find_method(rec_sym, node.call_expr.name) {
rec_sym := g.table.sym(g.unwrap_generic(node.call_expr.receiver_type))
if f := rec_sym.find_method_with_generic_parent(node.call_expr.name) {
mut muttable := unsafe { &ast.Table(g.table) }
return_type := muttable.resolve_generic_to_concrete(f.return_type,
f.generic_names, node.call_expr.concrete_types) or { f.return_type }

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