gen: fix assigning an anon fn to a struct field (#6965)

pull/6979/head
Daniel Däschle 2020-11-27 10:15:48 +01:00 committed by GitHub
parent cbe607baf2
commit ee2a5727fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 7 deletions

View File

@ -1522,8 +1522,8 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
g.write('static ') g.write('static ')
} }
mut return_type := table.void_type mut return_type := table.void_type
op := if assign_stmt.op == .decl_assign { token.Kind.assign } else { assign_stmt.op }
is_decl := assign_stmt.op == .decl_assign is_decl := assign_stmt.op == .decl_assign
op := if is_decl { token.Kind.assign } else { assign_stmt.op }
right_expr := assign_stmt.right[0] right_expr := assign_stmt.right[0]
match right_expr { match right_expr {
ast.CallExpr { return_type = right_expr.return_type } ast.CallExpr { return_type = right_expr.return_type }
@ -1756,12 +1756,18 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
if blank_assign { if blank_assign {
g.write('{') g.write('{')
} }
ret_styp := g.typ(val.decl.return_type) // if it's a decl assign (`:=`) or a blank assignment `_ =`/`_ :=` then generate `void (*ident) (args) =`
g.write('$ret_styp (*$ident.name) (') if (is_decl || blank_assign) && left is ast.Ident {
def_pos := g.definitions.len ret_styp := g.typ(val.decl.return_type)
g.fn_args(val.decl.params, val.decl.is_variadic) g.write('$ret_styp (*$ident.name) (')
g.definitions.go_back(g.definitions.len - def_pos) def_pos := g.definitions.len
g.write(') = ') g.fn_args(val.decl.params, val.decl.is_variadic)
g.definitions.go_back(g.definitions.len - def_pos)
g.write(') = ')
} else {
g.expr(left)
g.write(' = ')
}
g.expr(val) g.expr(val)
g.writeln(';') g.writeln(';')
if blank_assign { if blank_assign {

View File

@ -8,3 +8,16 @@ fn test_go_anon_fn() {
}(mut wg) }(mut wg)
wg.wait() wg.wait()
} }
struct AnonFnWrapper {
mut:
fn_ fn () bool
}
fn test_anon_assign_struct() {
mut w := AnonFnWrapper{}
w.fn_ = fn () bool {
return true
}
assert w.fn_()
}