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)