49 lines
		
	
	
		
			952 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			952 B
		
	
	
	
		
			Go
		
	
	
	
// +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 main.a
 | 
						|
	print(t2.GetX()) // @pointsto main.b
 | 
						|
}
 | 
						|
 | 
						|
func context2() {
 | 
						|
	id := func(x *int) *int {
 | 
						|
		print(x) // @pointsto main.a | main.b
 | 
						|
		return x
 | 
						|
	}
 | 
						|
	print(id(&a)) // @pointsto main.a
 | 
						|
	print(id(&b)) // @pointsto main.b
 | 
						|
 | 
						|
	// Same again, but anon func has free vars.
 | 
						|
	var c int // @line context2c
 | 
						|
	id2 := func(x *int) (*int, *int) {
 | 
						|
		print(x) // @pointsto main.a | main.b
 | 
						|
		return x, &c
 | 
						|
	}
 | 
						|
	p, q := id2(&a)
 | 
						|
	print(p) // @pointsto main.a
 | 
						|
	print(q) // @pointsto c@context2c:6
 | 
						|
	r, s := id2(&b)
 | 
						|
	print(r) // @pointsto main.b
 | 
						|
	print(s) // @pointsto c@context2c:6
 | 
						|
}
 | 
						|
 | 
						|
func main() {
 | 
						|
	context1()
 | 
						|
	context2()
 | 
						|
}
 |