blob: b76c2007013dfe87cd9eed8d4fb8950329e16e0a [file] [log] [blame]
//go:build ignore
// +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 command-line-arguments.a
print(t2.GetX()) // @pointsto command-line-arguments.b
}
func context2() {
id := func(x *int) *int {
print(x) // @pointsto command-line-arguments.a | command-line-arguments.b
return x
}
print(id(&a)) // @pointsto command-line-arguments.a
print(id(&b)) // @pointsto command-line-arguments.b
// Same again, but anon func has free vars.
var c int // @line context2c
id2 := func(x *int) (*int, *int) {
print(x) // @pointsto command-line-arguments.a | command-line-arguments.b
return x, &c
}
p, q := id2(&a)
print(p) // @pointsto command-line-arguments.a
print(q) // @pointsto c@context2c:6
r, s := id2(&b)
print(r) // @pointsto command-line-arguments.b
print(s) // @pointsto c@context2c:6
}
func main() {
context1()
context2()
}