| package main |
| |
| // Tests of defer. (Deferred recover() belongs is recover.go.) |
| |
| import "fmt" |
| |
| func deferMutatesResults(noArgReturn bool) (a, b int) { |
| defer func() { |
| if a != 1 || b != 2 { |
| panic(fmt.Sprint(a, b)) |
| } |
| a, b = 3, 4 |
| }() |
| if noArgReturn { |
| a, b = 1, 2 |
| return |
| } |
| return 1, 2 |
| } |
| |
| func init() { |
| a, b := deferMutatesResults(true) |
| if a != 3 || b != 4 { |
| panic(fmt.Sprint(a, b)) |
| } |
| a, b = deferMutatesResults(false) |
| if a != 3 || b != 4 { |
| panic(fmt.Sprint(a, b)) |
| } |
| } |
| |
| // We concatenate init blocks to make a single function, but we must |
| // run defers at the end of each block, not the combined function. |
| var deferCount = 0 |
| |
| func init() { |
| deferCount = 1 |
| defer func() { |
| deferCount++ |
| }() |
| // defer runs HERE |
| } |
| |
| func init() { |
| // Strictly speaking the spec says deferCount may be 0 or 2 |
| // since the relative order of init blocks is unspecified. |
| if deferCount != 2 { |
| panic(deferCount) // defer call has not run! |
| } |
| } |
| |
| func main() { |
| } |