cgen: fix calling function-pointer fields on interfaces (#9948)

pull/9954/head
spaceface 2021-05-01 15:45:53 +02:00 committed by GitHub
parent 4348c2322d
commit ef63491a8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 1 deletions

View File

@ -757,7 +757,13 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
// TODO: test node.left instead
// left & left_type will be `x` and `x type` in `x.fieldfn()`
// will be `0` for `foo()`
mut is_interface_call := false
if node.left_type != 0 {
left_sym := g.table.get_type_symbol(node.left_type)
if left_sym.kind == .interface_ {
is_interface_call = true
g.write('(*')
}
g.expr(node.left)
if node.left_type.is_ptr() {
g.write('->')
@ -889,8 +895,12 @@ fn (mut g Gen) fn_call(node ast.CallExpr) {
// g.writeln(';')
// g.write(cur_line + ' /* <== af cur line*/')
// }
g.write(g.get_ternary_name(name))
if is_interface_call {
g.write(')')
}
mut tmp_cnt_save := -1
g.write('${g.get_ternary_name(name)}(')
g.write('(')
if g.is_json_fn {
g.write(json_obj)
} else {

View File

@ -54,3 +54,21 @@ fn test_interface_fields() {
assert c.breed == 'what??'
assert d.breed == 'what??'
}
struct Nofun {
foo fn (int) int
}
interface NofunInterface {
foo fn (int) int
}
fn my_fn(a int) int {
assert a == 123
return a * 2
}
fn test_interface_fn_pointer_fields() {
nf := NofunInterface(Nofun{my_fn})
assert nf.foo(123) == 246
}