github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/callgraph/vta/testdata/src/function_alias.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 Doer func() 10 11 type A struct { 12 foo func() 13 do Doer 14 } 15 16 func Baz(f func()) { 17 j := &f 18 k := &j 19 **k = func() {} 20 a := A{} 21 a.foo = **k 22 a.foo() 23 a.do = a.foo 24 a.do() 25 } 26 27 // Relevant SSA: 28 // func Baz(f func()): 29 // t0 = new func() (f) 30 // *t0 = f 31 // t1 = new *func() (j) 32 // *t1 = t0 33 // t2 = *t1 34 // *t2 = Baz$1 35 // t3 = local A (a) 36 // t4 = &t3.foo [#0] 37 // t5 = *t1 38 // t6 = *t5 39 // *t4 = t6 40 // t7 = &t3.foo [#0] 41 // t8 = *t7 42 // t9 = t8() 43 // t10 = &t3.do [#1] *Doer 44 // t11 = &t3.foo [#0] *func() 45 // t12 = *t11 func() 46 // t13 = changetype Doer <- func() (t12) Doer 47 // *t10 = t13 48 // t14 = &t3.do [#1] *Doer 49 // t15 = *t14 Doer 50 // t16 = t15() () 51 52 // Flow chain showing that Baz$1 reaches t8(): 53 // Baz$1 -> t2 <-> PtrFunction(func()) <-> t5 -> t6 -> t4 <-> Field(testdata.A:foo) <-> t7 -> t8 54 // Flow chain showing that Baz$1 reaches t15(): 55 // Field(testdata.A:foo) <-> t11 -> t12 -> t13 -> t10 <-> Field(testdata.A:do) <-> t14 -> t15 56 57 // WANT: 58 // Local(f) -> Local(t0) 59 // Local(t0) -> PtrFunction(func()) 60 // Function(Baz$1) -> Local(t2) 61 // PtrFunction(func()) -> Local(t0), Local(t2), Local(t5) 62 // Local(t2) -> PtrFunction(func()) 63 // Local(t4) -> Field(testdata.A:foo) 64 // Local(t5) -> Local(t6), PtrFunction(func()) 65 // Local(t6) -> Local(t4) 66 // Local(t7) -> Field(testdata.A:foo), Local(t8) 67 // Field(testdata.A:foo) -> Local(t11), Local(t4), Local(t7) 68 // Local(t4) -> Field(testdata.A:foo) 69 // Field(testdata.A:do) -> Local(t10), Local(t14) 70 // Local(t10) -> Field(testdata.A:do) 71 // Local(t11) -> Field(testdata.A:foo), Local(t12) 72 // Local(t12) -> Local(t13) 73 // Local(t13) -> Local(t10) 74 // Local(t14) -> Field(testdata.A:do), Local(t15)