cgen: defer was broken in presence of anon fn. fixed #7171
							parent
							
								
									3386526610
								
							
						
					
					
						commit
						805da2325f
					
				|  | @ -149,11 +149,19 @@ fn (mut g Gen) gen_fn_decl(it ast.FnDecl, skip bool) { | |||
| 	if g.pref.is_prof { | ||||
| 		g.profile_fn(it) | ||||
| 	} | ||||
| 	// we could be in an anon fn so save outer fn defer stmts
 | ||||
| 	prev_defer_stmts := g.defer_stmts | ||||
| 	g.defer_stmts = [] | ||||
| 	g.stmts(it.stmts) | ||||
| 	//
 | ||||
| 	if it.return_type == table.void_type { | ||||
| 		g.write_defer_stmts_when_needed() | ||||
| 	} | ||||
| 	if it.is_anon { | ||||
| 		g.defer_stmts = prev_defer_stmts | ||||
| 	} else { | ||||
| 		g.defer_stmts = [] | ||||
| 	} | ||||
| 	if it.return_type != table.void_type && it.stmts.len > 0 && it.stmts.last() !is ast.Return { | ||||
| 		default_expr := g.type_default(it.return_type) | ||||
| 		// TODO: perf?
 | ||||
|  | @ -164,7 +172,6 @@ fn (mut g Gen) gen_fn_decl(it ast.FnDecl, skip bool) { | |||
| 		} | ||||
| 	} | ||||
| 	g.writeln('}') | ||||
| 	g.defer_stmts = [] | ||||
| 	if g.pref.printfn_list.len > 0 && g.last_fn_c_name in g.pref.printfn_list { | ||||
| 		println(g.out.after(fn_start_pos)) | ||||
| 	} | ||||
|  |  | |||
|  | @ -45,6 +45,10 @@ mut: | |||
| 	val int | ||||
| } | ||||
| 
 | ||||
| fn (n Num) add(i int) int { | ||||
| 	return n.val + i | ||||
| } | ||||
| 
 | ||||
| fn test_defer_early_exit() { | ||||
| 	mut sum := Num{0} | ||||
| 	for i in 0 .. 10 { | ||||
|  | @ -59,3 +63,23 @@ fn test_defer_option() { | |||
| 	set_num_opt(mut ok) or {} | ||||
| 	assert ok.val == 1 | ||||
| } | ||||
| 
 | ||||
| fn test_defer_with_anon_fn() { | ||||
| 	mut f := &Num{val: 110} | ||||
| 	defer { | ||||
| 		assert f.add(1) == 111 | ||||
| 	} | ||||
| 	go fn () { | ||||
| 		defer { | ||||
| 			println('deferred 1') | ||||
| 		} | ||||
| 	}() | ||||
| 	x := fn () { | ||||
| 		defer { | ||||
| 			println('defered 2') | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 	x() | ||||
| 	return | ||||
| } | ||||
		Loading…
	
		Reference in New Issue