101 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| // +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 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()
 | |
| }
 |