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 / pointer / testdata / context.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/go/pointer/testdata/context.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/go/pointer/testdata/context.go
new file mode 100644 (file)
index 0000000..ed616e7
--- /dev/null
@@ -0,0 +1,48 @@
+// +build ignore
+
+package main
+
+// Test of context-sensitive treatment of certain function calls,
+// e.g. static calls to simple accessor methods.
+
+var a, b int
+
+type T struct{ x *int }
+
+func (t *T) SetX(x *int) { t.x = x }
+func (t *T) GetX() *int  { return t.x }
+
+func context1() {
+       var t1, t2 T
+       t1.SetX(&a)
+       t2.SetX(&b)
+       print(t1.GetX()) // @pointsto main.a
+       print(t2.GetX()) // @pointsto main.b
+}
+
+func context2() {
+       id := func(x *int) *int {
+               print(x) // @pointsto main.a | main.b
+               return x
+       }
+       print(id(&a)) // @pointsto main.a
+       print(id(&b)) // @pointsto main.b
+
+       // Same again, but anon func has free vars.
+       var c int // @line context2c
+       id2 := func(x *int) (*int, *int) {
+               print(x) // @pointsto main.a | main.b
+               return x, &c
+       }
+       p, q := id2(&a)
+       print(p) // @pointsto main.a
+       print(q) // @pointsto c@context2c:6
+       r, s := id2(&b)
+       print(r) // @pointsto main.b
+       print(s) // @pointsto c@context2c:6
+}
+
+func main() {
+       context1()
+       context2()
+}