ast, checker, cgen: fix error for go anon fn variable call (#13776)
parent
c05634ebd1
commit
3e40cd5baa
|
@ -557,6 +557,7 @@ pub mut:
|
||||||
name string // left.name()
|
name string // left.name()
|
||||||
is_method bool
|
is_method bool
|
||||||
is_field bool // temp hack, remove ASAP when re-impl CallExpr / Selector (joe)
|
is_field bool // temp hack, remove ASAP when re-impl CallExpr / Selector (joe)
|
||||||
|
is_fn_var bool // fn variable
|
||||||
is_keep_alive bool // GC must not free arguments before fn returns
|
is_keep_alive bool // GC must not free arguments before fn returns
|
||||||
is_noreturn bool // whether the function/method is marked as [noreturn]
|
is_noreturn bool // whether the function/method is marked as [noreturn]
|
||||||
is_ctor_new bool // if JS ctor calls requires `new` before call, marked as `[use_new]` in V
|
is_ctor_new bool // if JS ctor calls requires `new` before call, marked as `[use_new]` in V
|
||||||
|
@ -568,6 +569,7 @@ pub mut:
|
||||||
left_type Type // type of `user`
|
left_type Type // type of `user`
|
||||||
receiver_type Type // User
|
receiver_type Type // User
|
||||||
return_type Type
|
return_type Type
|
||||||
|
fn_var_type Type // fn variable type
|
||||||
should_be_skipped bool // true for calls to `[if someflag?]` functions, when there is no `-d someflag`
|
should_be_skipped bool // true for calls to `[if someflag?]` functions, when there is no `-d someflag`
|
||||||
concrete_types []Type // concrete types, e.g. <int, string>
|
concrete_types []Type // concrete types, e.g. <int, string>
|
||||||
concrete_list_pos token.Pos
|
concrete_list_pos token.Pos
|
||||||
|
|
|
@ -600,9 +600,13 @@ pub fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool)
|
||||||
match obj {
|
match obj {
|
||||||
ast.GlobalField {
|
ast.GlobalField {
|
||||||
typ = obj.typ
|
typ = obj.typ
|
||||||
|
node.is_fn_var = true
|
||||||
|
node.fn_var_type = typ
|
||||||
}
|
}
|
||||||
ast.Var {
|
ast.Var {
|
||||||
typ = if obj.smartcasts.len != 0 { obj.smartcasts.last() } else { obj.typ }
|
typ = if obj.smartcasts.len != 0 { obj.smartcasts.last() } else { obj.typ }
|
||||||
|
node.is_fn_var = true
|
||||||
|
node.fn_var_type = typ
|
||||||
}
|
}
|
||||||
else {}
|
else {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5106,6 +5106,8 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
|
||||||
} else if mut expr.left is ast.AnonFn {
|
} else if mut expr.left is ast.AnonFn {
|
||||||
g.gen_anon_fn_decl(mut expr.left)
|
g.gen_anon_fn_decl(mut expr.left)
|
||||||
name = expr.left.decl.name
|
name = expr.left.decl.name
|
||||||
|
} else if expr.is_fn_var {
|
||||||
|
name = g.table.sym(expr.fn_var_type).name
|
||||||
}
|
}
|
||||||
name = util.no_dots(name)
|
name = util.no_dots(name)
|
||||||
if g.pref.obfuscate && g.cur_mod.name == 'main' && name.starts_with('main__') {
|
if g.pref.obfuscate && g.cur_mod.name == 'main' && name.starts_with('main__') {
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
fn sum(a int, b int) int {
|
||||||
|
// Simply proxy the function into an anonymous function for demo purposes
|
||||||
|
sum_func := fn (a int, b int) int {
|
||||||
|
return a + b
|
||||||
|
}
|
||||||
|
|
||||||
|
// and run it concurrently
|
||||||
|
g := go sum_func(a, b)
|
||||||
|
|
||||||
|
result := g.wait()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_go_anon_fn_variable_call() {
|
||||||
|
ret := sum(22, 33)
|
||||||
|
println(ret)
|
||||||
|
assert ret == 55
|
||||||
|
}
|
Loading…
Reference in New Issue