Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / go / ssa / interp / testdata / defer.go
1 package main
2
3 // Tests of defer.  (Deferred recover() belongs is recover.go.)
4
5 import "fmt"
6
7 func deferMutatesResults(noArgReturn bool) (a, b int) {
8         defer func() {
9                 if a != 1 || b != 2 {
10                         panic(fmt.Sprint(a, b))
11                 }
12                 a, b = 3, 4
13         }()
14         if noArgReturn {
15                 a, b = 1, 2
16                 return
17         }
18         return 1, 2
19 }
20
21 func init() {
22         a, b := deferMutatesResults(true)
23         if a != 3 || b != 4 {
24                 panic(fmt.Sprint(a, b))
25         }
26         a, b = deferMutatesResults(false)
27         if a != 3 || b != 4 {
28                 panic(fmt.Sprint(a, b))
29         }
30 }
31
32 // We concatenate init blocks to make a single function, but we must
33 // run defers at the end of each block, not the combined function.
34 var deferCount = 0
35
36 func init() {
37         deferCount = 1
38         defer func() {
39                 deferCount++
40         }()
41         // defer runs HERE
42 }
43
44 func init() {
45         // Strictly speaking the spec says deferCount may be 0 or 2
46         // since the relative order of init blocks is unspecified.
47         if deferCount != 2 {
48                 panic(deferCount) // defer call has not run!
49         }
50 }
51
52 func main() {
53 }