gen: fix assigning an anon fn to a struct field (#6965)
							parent
							
								
									cbe607baf2
								
							
						
					
					
						commit
						ee2a5727fb
					
				|  | @ -1522,8 +1522,8 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { | |||
| 		g.write('static ') | ||||
| 	} | ||||
| 	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 | ||||
| 	op := if is_decl { token.Kind.assign } else { assign_stmt.op } | ||||
| 	right_expr := assign_stmt.right[0] | ||||
| 	match right_expr { | ||||
| 		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 { | ||||
| 					g.write('{') | ||||
| 				} | ||||
| 				ret_styp := g.typ(val.decl.return_type) | ||||
| 				g.write('$ret_styp (*$ident.name) (') | ||||
| 				def_pos := g.definitions.len | ||||
| 				g.fn_args(val.decl.params, val.decl.is_variadic) | ||||
| 				g.definitions.go_back(g.definitions.len - def_pos) | ||||
| 				g.write(') = ') | ||||
| 				// if it's a decl assign (`:=`) or a blank assignment `_ =`/`_ :=` then generate `void (*ident) (args) =`
 | ||||
| 				if (is_decl || blank_assign) && left is ast.Ident { | ||||
| 					ret_styp := g.typ(val.decl.return_type) | ||||
| 					g.write('$ret_styp (*$ident.name) (') | ||||
| 					def_pos := g.definitions.len | ||||
| 					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.writeln(';') | ||||
| 				if blank_assign { | ||||
|  |  | |||
|  | @ -8,3 +8,16 @@ fn test_go_anon_fn() { | |||
| 	}(mut wg) | ||||
| 	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_() | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue