github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/callgraph/vta/testdata/src/dynamic_calls.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(I) 11 } 12 13 type A struct{} 14 15 func (a A) foo(ai I) {} 16 17 type B struct{} 18 19 func (b B) foo(bi I) {} 20 21 func doWork() I { return nil } 22 func close() I { return nil } 23 24 func Baz(x B, h func() I, i I) I { 25 i.foo(x) 26 27 return h() 28 } 29 30 // Relevant SSA: 31 // func Baz(x B, h func() I, i I) I: 32 // t0 = local B (x) 33 // *t0 = x 34 // t1 = *t0 35 // t2 = make I <- B (t1) 36 // t3 = invoke i.foo(t2) 37 // t4 = h() 38 // return t4 39 40 // Local(t2) has seemingly duplicates of successors. This 41 // happens in stringification of type propagation graph. 42 // Due to CHA, we analyze A.foo and *A.foo as well as B.foo 43 // and *B.foo, which have similar bodies and hence similar 44 // type flow that gets merged together during stringification. 45 46 // WANT: 47 // Local(t2) -> Local(ai), Local(ai), Local(bi), Local(bi) 48 // Constant(testdata.I) -> Local(t4) 49 // Local(t1) -> Local(t2)