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()
 | |
| }
 |