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 / callgraph / rta / testdata / iface.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/callgraph/rta/testdata/iface.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/callgraph/rta/testdata/iface.go
new file mode 100644 (file)
index 0000000..8f84c93
--- /dev/null
@@ -0,0 +1,79 @@
+// +build ignore
+
+package main
+
+// Test of interface calls.
+
+func use(interface{})
+
+type A byte // instantiated but not a reflect type
+
+func (A) f() {} // called directly
+func (A) F() {} // unreachable
+
+type B int // a reflect type
+
+func (*B) f() {} // reachable via interface invoke
+func (*B) F() {} // reachable: exported method of reflect type
+
+type B2 int // a reflect type, and *B2 also
+
+func (B2) f() {} // reachable via interface invoke
+func (B2) g() {} // reachable: exported method of reflect type
+
+type C string // not instantiated
+
+func (C) f() {} // unreachable
+func (C) F() {} // unreachable
+
+type D uint // instantiated only in dead code
+
+func (D) f() {} // unreachable
+func (D) F() {} // unreachable
+
+func main() {
+       A(0).f()
+
+       use(new(B))
+       use(B2(0))
+
+       var i interface {
+               f()
+       }
+       i.f() // calls (*B).f, (*B2).f and (B2.f)
+
+       live()
+}
+
+func live() {
+       var j interface {
+               f()
+               g()
+       }
+       j.f() // calls (B2).f and (*B2).f but not (*B).f (no g method).
+}
+
+func dead() {
+       use(D(0))
+}
+
+// WANT:
+// Dynamic calls
+//   live --> (*B2).f
+//   live --> (B2).f
+//   main --> (*B).f
+//   main --> (*B2).f
+//   main --> (B2).f
+// Reachable functions
+//   (*B).F
+//   (*B).f
+//   (*B2).f
+//   (A).f
+//   (B2).f
+//   live
+//   use
+// Reflect types
+//   *B
+//   *B2
+//   B
+//   B2