13 type D struct{ ptr *int }
23 var unknown bool // defeat dead-code elimination
26 var i interface{} = &a
27 var j interface{} = D{&b}
33 print(i) // @types *int
35 print(k) // @types *int | D
37 print(i.(*int)) // @pointsto main.a
38 print(j.(*int)) // @pointsto
39 print(k.(*int)) // @pointsto main.a
41 print(i.(D).ptr) // @pointsto
42 print(j.(D).ptr) // @pointsto main.b
43 print(k.(D).ptr) // @pointsto main.b
56 print(k) // @types *C | D
57 print(k) // @pointsto makeinterface:main.D | makeinterface:*main.C
60 // @calls main.interface2 -> (*main.C).f
61 // @calls main.interface2 -> (main.D).f
63 print(i.(*C)) // @pointsto main.a
64 print(j.(D).ptr) // @pointsto main.a
65 print(k.(*C)) // @pointsto main.a
67 switch x := k.(type) {
69 print(x) // @pointsto main.a
71 print(x.ptr) // @pointsto main.a
78 // There should be no backflow of concrete types from the type-switch to x.
80 print(x) // @types int
88 var i interface{} = D{&a}
93 print(i) // @types int | D
95 j := i.(I) // interface narrowing type-assertion
97 print(j.(D).ptr) // @pointsto main.a
99 var l interface{} = j // interface widening assignment.
101 print(l.(D).ptr) // @pointsto main.a
103 m := j.(interface{}) // interface widening type-assertion.
105 print(m.(D).ptr) // @pointsto main.a
108 // Interface method calls and value flow:
118 func (p *P) f(pi *int) *int {
119 print(p) // @pointsto p@i5p:6
120 print(pi) // @pointsto i@i5i:6
127 var i int // @line i5i
128 print(j.f(&i)) // @pointsto p.x@i5p:6
129 print(&i) // @pointsto i@i5i:6
131 print(j) // @pointsto makeinterface:*main.P
134 // @calls main.interface5 -> (*main.P).f
138 print(f) // @pointsto (main.I).f$thunk
142 // @calls main.interface6 -> (main.I).f$thunk
143 // @calls (main.I).f$thunk -> (*struct{main.D}).f