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)