github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/callgraph/vta/testdata/src/fields.go (about) 1 // Copyright 2021 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // go:build ignore 6 7 package testdata 8 9 type I interface { 10 Foo() 11 } 12 13 type J interface { 14 I 15 Bar() 16 } 17 18 type A struct{} 19 20 func (a A) Foo() {} 21 func (a A) Bar() {} 22 23 type B struct { 24 a A 25 i I 26 } 27 28 func Do() B { 29 b := B{} 30 return b 31 } 32 33 func Baz(b B) { 34 var j J 35 j = b.a 36 37 j.Bar() 38 39 b.i = j 40 41 Do().i.Foo() 42 } 43 44 // Relevant SSA: 45 // func Baz(b B): 46 // t0 = local B (b) 47 // *t0 = b 48 // t1 = &t0.a [#0] // no flow here since a is of concrete type 49 // t2 = *t1 50 // t3 = make J <- A (t2) 51 // t4 = invoke t3.Bar() 52 // t5 = &t0.i [#1] 53 // t6 = change interface I <- J (t3) 54 // *t5 = t6 55 // t7 = Do() 56 // t8 = t7.i [#0] 57 // t9 = (A).Foo(t8) 58 // return 59 60 // WANT: 61 // Field(testdata.B:i) -> Local(t5), Local(t8) 62 // Local(t5) -> Field(testdata.B:i) 63 // Local(t2) -> Local(t3) 64 // Local(t3) -> Local(t6) 65 // Local(t6) -> Local(t5)