// +build ignore package main var unknown bool // defeat dead-code elimination var p, q int type A struct { f *int g interface{} } func (a A) m1() { print(a.f) // @pointsto main.p } func (a *A) m2() { print(a) // @pointsto complit.A@struct1s:9 print(a.f) // @pointsto main.p } type B struct { h *int A } func structs1() { b := &B{ // @line struct1s h: &q, } b.f = &p b.g = b print(b.h) // @pointsto main.q print(b.f) // @pointsto main.p print(b.g) // @types *B ptr := &b.f print(*ptr) // @pointsto main.p b.m1() b.m2() } // @calls main.structs1 -> (main.A).m1 // @calls main.structs1 -> (*main.A).m2 // @calls (*main.B).m1 -> (main.A).m1 // @calls (*main.B).m2 -> (*main.A).m2 type T struct { x int y int } type S struct { a [3]T b *[3]T c [3]*T } func structs2() { var s S // @line s2s print(&s) // @pointsto s@s2s:6 print(&s.a) // @pointsto s.a@s2s:6 print(&s.a[0]) // @pointsto s.a[*]@s2s:6 print(&s.a[0].x) // @pointsto s.a[*].x@s2s:6 print(&s.a[0].y) // @pointsto s.a[*].y@s2s:6 print(&s.b) // @pointsto s.b@s2s:6 print(&s.b[0]) // @pointsto print(&s.b[0].x) // @pointsto print(&s.b[0].y) // @pointsto print(&s.c) // @pointsto s.c@s2s:6 print(&s.c[0]) // @pointsto s.c[*]@s2s:6 print(&s.c[0].x) // @pointsto print(&s.c[0].y) // @pointsto var s2 S // @line s2s2 s2.b = new([3]T) // @line s2s2b print(s2.b) // @pointsto new@s2s2b:12 print(&s2.b) // @pointsto s2.b@s2s2:6 print(&s2.b[0]) // @pointsto new[*]@s2s2b:12 print(&s2.b[0].x) // @pointsto new[*].x@s2s2b:12 print(&s2.b[0].y) // @pointsto new[*].y@s2s2b:12 print(&s2.c[0].x) // @pointsto print(&s2.c[0].y) // @pointsto var s3 S // @line s2s3 s3.c[2] = new(T) // @line s2s3c print(s3.c) // @pointsto print(&s3.c) // @pointsto s3.c@s2s3:6 print(s3.c[1]) // @pointsto new@s2s3c:15 print(&s3.c[1]) // @pointsto s3.c[*]@s2s3:6 print(&s3.c[1].x) // @pointsto new.x@s2s3c:15 print(&s3.c[1].y) // @pointsto new.y@s2s3c:15 } func main() { structs1() structs2() }