github.com/v2fly/tools@v0.100.0/go/pointer/testdata/context.go (about) 1 // +build ignore 2 3 package main 4 5 // Test of context-sensitive treatment of certain function calls, 6 // e.g. static calls to simple accessor methods. 7 8 var a, b int 9 10 type T struct{ x *int } 11 12 func (t *T) SetX(x *int) { t.x = x } 13 func (t *T) GetX() *int { return t.x } 14 15 func context1() { 16 var t1, t2 T 17 t1.SetX(&a) 18 t2.SetX(&b) 19 print(t1.GetX()) // @pointsto main.a 20 print(t2.GetX()) // @pointsto main.b 21 } 22 23 func context2() { 24 id := func(x *int) *int { 25 print(x) // @pointsto main.a | main.b 26 return x 27 } 28 print(id(&a)) // @pointsto main.a 29 print(id(&b)) // @pointsto main.b 30 31 // Same again, but anon func has free vars. 32 var c int // @line context2c 33 id2 := func(x *int) (*int, *int) { 34 print(x) // @pointsto main.a | main.b 35 return x, &c 36 } 37 p, q := id2(&a) 38 print(p) // @pointsto main.a 39 print(q) // @pointsto c@context2c:6 40 r, s := id2(&b) 41 print(r) // @pointsto main.b 42 print(s) // @pointsto c@context2c:6 43 } 44 45 func main() { 46 context1() 47 context2() 48 }