1// +build ignore 2 3package main 4 5// Test of context-sensitive treatment of certain function calls, 6// e.g. static calls to simple accessor methods. 7 8var a, b int 9 10type T struct{ x *int } 11 12func (t *T) SetX(x *int) { t.x = x } 13func (t *T) GetX() *int { return t.x } 14 15func 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 23func 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 45func main() { 46 context1() 47 context2() 48} 49