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