golang.org/x/tools@v0.21.1-0.20240520172518-788d39e776b1/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 = *t1 37 // t5 = *t4 38 // t6 = &t3.foo [#0] 39 // *t6 = t5 40 // t7 = &t3.foo [#0] 41 // t8 = *t7 42 // t9 = t8() 43 // t10 = &t3.foo [#0] *func() 44 // t11 = *t10 func() 45 // t12 = &t3.do [#1] *Doer 46 // t13 = changetype Doer <- func() (t11) Doer 47 // *t12 = 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()) <-> t4 -> t5 -> t6 <-> Field(testdata.A:foo) <-> t7 -> t8 54 // Flow chain showing that Baz$1 reaches t15(): 55 // Field(testdata.A:foo) <-> t10 -> t11 -> t13 -> t12 <-> 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(t4) 62 // Local(t2) -> PtrFunction(func()) 63 // Local(t6) -> Field(testdata.A:foo) 64 // Local(t4) -> Local(t5), PtrFunction(func()) 65 // Local(t5) -> Local(t6) 66 // Local(t7) -> Field(testdata.A:foo), Local(t8) 67 // Field(testdata.A:foo) -> Local(t10), Local(t6), Local(t7) 68 // Local(t6) -> Field(testdata.A:foo) 69 // Field(testdata.A:do) -> Local(t12), Local(t14) 70 // Local(t12) -> Field(testdata.A:do) 71 // Local(t10) -> Field(testdata.A:foo), Local(t11) 72 // Local(t11) -> Local(t13) 73 // Local(t13) -> Local(t12) 74 // Local(t14) -> Field(testdata.A:do), Local(t15)