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

     1  // +build ignore
     2  
     3  package main
     4  
     5  var unknown bool // defeat dead-code elimination
     6  
     7  var p, q int
     8  
     9  type A struct {
    10  	f *int
    11  	g interface{}
    12  }
    13  
    14  func (a A) m1() {
    15  	print(a.f) // @pointsto main.p
    16  }
    17  
    18  func (a *A) m2() {
    19  	print(a)   // @pointsto complit.A@struct1s:9
    20  	print(a.f) // @pointsto main.p
    21  }
    22  
    23  type B struct {
    24  	h *int
    25  	A
    26  }
    27  
    28  func structs1() {
    29  	b := &B{ // @line struct1s
    30  		h: &q,
    31  	}
    32  	b.f = &p
    33  	b.g = b
    34  
    35  	print(b.h) // @pointsto main.q
    36  	print(b.f) // @pointsto main.p
    37  	print(b.g) // @types *B
    38  
    39  	ptr := &b.f
    40  	print(*ptr) // @pointsto main.p
    41  
    42  	b.m1()
    43  	b.m2()
    44  }
    45  
    46  // @calls main.structs1 -> (main.A).m1
    47  // @calls main.structs1 -> (*main.A).m2
    48  // @calls (*main.B).m1 -> (main.A).m1
    49  // @calls (*main.B).m2 -> (*main.A).m2
    50  
    51  type T struct {
    52  	x int
    53  	y int
    54  }
    55  
    56  type S struct {
    57  	a [3]T
    58  	b *[3]T
    59  	c [3]*T
    60  }
    61  
    62  func structs2() {
    63  	var s S          // @line s2s
    64  	print(&s)        // @pointsto s@s2s:6
    65  	print(&s.a)      // @pointsto s.a@s2s:6
    66  	print(&s.a[0])   // @pointsto s.a[*]@s2s:6
    67  	print(&s.a[0].x) // @pointsto s.a[*].x@s2s:6
    68  	print(&s.a[0].y) // @pointsto s.a[*].y@s2s:6
    69  	print(&s.b)      // @pointsto s.b@s2s:6
    70  	print(&s.b[0])   // @pointsto
    71  	print(&s.b[0].x) // @pointsto
    72  	print(&s.b[0].y) // @pointsto
    73  	print(&s.c)      // @pointsto s.c@s2s:6
    74  	print(&s.c[0])   // @pointsto s.c[*]@s2s:6
    75  	print(&s.c[0].x) // @pointsto
    76  	print(&s.c[0].y) // @pointsto
    77  
    78  	var s2 S          // @line s2s2
    79  	s2.b = new([3]T)  // @line s2s2b
    80  	print(s2.b)       // @pointsto new@s2s2b:12
    81  	print(&s2.b)      // @pointsto s2.b@s2s2:6
    82  	print(&s2.b[0])   // @pointsto new[*]@s2s2b:12
    83  	print(&s2.b[0].x) // @pointsto new[*].x@s2s2b:12
    84  	print(&s2.b[0].y) // @pointsto new[*].y@s2s2b:12
    85  	print(&s2.c[0].x) // @pointsto
    86  	print(&s2.c[0].y) // @pointsto
    87  
    88  	var s3 S          // @line s2s3
    89  	s3.c[2] = new(T)  // @line s2s3c
    90  	print(&s3.c)      // @pointsto s3.c@s2s3:6
    91  	print(s3.c[1])    // @pointsto new@s2s3c:15
    92  	print(&s3.c[1])   // @pointsto s3.c[*]@s2s3:6
    93  	print(&s3.c[1].x) // @pointsto new.x@s2s3c:15
    94  	print(&s3.c[1].y) // @pointsto new.y@s2s3c:15
    95  }
    96  
    97  func main() {
    98  	structs1()
    99  	structs2()
   100  }