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