github.com/v2fly/tools@v0.100.0/go/pointer/testdata/context.go (about)

     1  // +build ignore
     2  
     3  package main
     4  
     5  // Test of context-sensitive treatment of certain function calls,
     6  // e.g. static calls to simple accessor methods.
     7  
     8  var a, b int
     9  
    10  type T struct{ x *int }
    11  
    12  func (t *T) SetX(x *int) { t.x = x }
    13  func (t *T) GetX() *int  { return t.x }
    14  
    15  func 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  
    23  func 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  
    45  func main() {
    46  	context1()
    47  	context2()
    48  }