cgen: fix `go fn(mut x Interface){ println(x) }(x)` (#10585)
parent
625dc6e0ff
commit
4af4f2b5a5
|
@ -5942,10 +5942,34 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
|
||||||
g.gowrappers.write_string(', ')
|
g.gowrappers.write_string(', ')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i in 0 .. expr.args.len {
|
if expr.args.len > 0 {
|
||||||
g.gowrappers.write_string('arg->arg${i + 1}')
|
mut has_cast := false
|
||||||
if i < expr.args.len - 1 {
|
for i in 0 .. expr.args.len {
|
||||||
g.gowrappers.write_string(', ')
|
if g.table.get_type_symbol(expr.expected_arg_types[i]).kind == .interface_
|
||||||
|
&& g.table.get_type_symbol(expr.args[i].typ).kind != .interface_ {
|
||||||
|
has_cast = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if has_cast {
|
||||||
|
pos := g.out.len
|
||||||
|
g.call_args(expr)
|
||||||
|
mut call_args_str := g.out.after(pos)
|
||||||
|
g.out.go_back(call_args_str.len)
|
||||||
|
mut rep_group := []string{cap: 2 * expr.args.len}
|
||||||
|
for i in 0 .. expr.args.len {
|
||||||
|
rep_group << g.expr_string(expr.args[i].expr)
|
||||||
|
rep_group << 'arg->arg${i + 1}'
|
||||||
|
}
|
||||||
|
call_args_str = call_args_str.replace_each(rep_group)
|
||||||
|
g.gowrappers.write_string(call_args_str)
|
||||||
|
} else {
|
||||||
|
for i in 0 .. expr.args.len {
|
||||||
|
g.gowrappers.write_string('arg->arg${i + 1}')
|
||||||
|
if i != expr.args.len - 1 {
|
||||||
|
g.gowrappers.write_string(', ')
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g.gowrappers.writeln(');')
|
g.gowrappers.writeln(');')
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
struct St1 {
|
||||||
|
val int = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
interface In1 {
|
||||||
|
val int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_go_wait_with_fn_of_interface_type() {
|
||||||
|
mut var := &St1{}
|
||||||
|
(go fn1(mut var)).wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fn1(mut v In1) {
|
||||||
|
println(v)
|
||||||
|
assert v.val == 5
|
||||||
|
}
|
Loading…
Reference in New Issue