@@ -289,6 +289,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
289289
290290 for i, mut left in node.left {
291291 mut is_auto_heap := false
292+ mut is_fn_var := false
292293 mut var_type := node.left_types[i]
293294 mut val_type := node.right_types[i]
294295 val := node.right[i]
@@ -432,6 +433,9 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
432433 }
433434 }
434435 is_auto_heap = left.obj.is_auto_heap
436+ if left.obj.typ != 0 && val is ast.PrefixExpr {
437+ is_fn_var = g.table.final_sym (left.obj.typ).kind == .function
438+ }
435439 }
436440 } else if mut left is ast.ComptimeSelector {
437441 if left.typ_key != '' {
@@ -964,14 +968,14 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
964968 } else {
965969 is_option_unwrapped := val is ast.Ident && val.or_expr.kind != .absent
966970 is_option_auto_heap := is_auto_heap && is_option_unwrapped
967- if is_auto_heap {
971+ if is_auto_heap && ! is_fn_var {
968972 if aligned != 0 {
969973 g.write ('HEAP_align(${styp} , (' )
970974 } else {
971975 g.write ('HEAP(${styp} , (' )
972976 }
973977 }
974- if val.is_auto_deref_var () && ! is_option_unwrapped {
978+ if ! is_fn_var && val.is_auto_deref_var () && ! is_option_unwrapped {
975979 g.write ('*' )
976980 }
977981 if (var_type.has_flag (.option) && val ! in [ast.Ident, ast.SelectorExpr])
@@ -997,9 +1001,13 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
9971001 g.fixed_array_var_init (tmp_var, false , unaliased_right_sym.info.elem_type,
9981002 unaliased_right_sym.info.size)
9991003 } else {
1004+ old_inside_assign_fn_var := g.inside_assign_fn_var
1005+ g.inside_assign_fn_var = val is ast.PrefixExpr && val.op == .amp
1006+ && is_fn_var
10001007 g.expr (val)
1008+ g.inside_assign_fn_var = old_inside_assign_fn_var
10011009 }
1002- if is_auto_heap && ! is_option_auto_heap {
1010+ if ! is_fn_var && is_auto_heap && ! is_option_auto_heap {
10031011 if aligned != 0 {
10041012 g.write ('), ${aligned} )' )
10051013 } else {
0 commit comments