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 / callgraph / cha / testdata / iface.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/go/callgraph/cha/testdata/iface.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/go/callgraph/cha/testdata/iface.go
new file mode 100644 (file)
index 0000000..8ca65e1
--- /dev/null
@@ -0,0 +1,65 @@
+// +build ignore
+
+package main
+
+// Test of interface calls.  None of the concrete types are ever
+// instantiated or converted to interfaces.
+
+type I interface {
+       f()
+}
+
+type J interface {
+       f()
+       g()
+}
+
+type C int // implements I
+
+func (*C) f()
+
+type D int // implements I and J
+
+func (*D) f()
+func (*D) g()
+
+func one(i I, j J) {
+       i.f() // calls *C and *D
+}
+
+func two(i I, j J) {
+       j.f() // calls *D (but not *C, even though it defines method f)
+}
+
+func three(i I, j J) {
+       j.g() // calls *D
+}
+
+func four(i I, j J) {
+       Jf := J.f
+       if unknown {
+               Jf = nil // suppress SSA constant propagation
+       }
+       Jf(nil) // calls *D
+}
+
+func five(i I, j J) {
+       jf := j.f
+       if unknown {
+               jf = nil // suppress SSA constant propagation
+       }
+       jf() // calls *D
+}
+
+var unknown bool
+
+// WANT:
+// Dynamic calls
+//   (J).f$bound --> (*D).f
+//   (J).f$thunk --> (*D).f
+//   five --> (J).f$bound
+//   four --> (J).f$thunk
+//   one --> (*C).f
+//   one --> (*D).f
+//   three --> (*D).g
+//   two --> (*D).f