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