Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / go / ssa / interp / testdata / defer.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/ssa/interp/testdata/defer.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/ssa/interp/testdata/defer.go
new file mode 100644 (file)
index 0000000..f5bae6c
--- /dev/null
@@ -0,0 +1,53 @@
+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() {
+}