github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/callgraph/vta/testdata/src/callgraph_field_funcs.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 WrappedFunc struct {
    10  	F func() complex64
    11  }
    12  
    13  func callWrappedFunc(f WrappedFunc) {
    14  	f.F()
    15  }
    16  
    17  func foo() complex64 {
    18  	println("foo")
    19  	return -1
    20  }
    21  
    22  func Foo(b bool) {
    23  	callWrappedFunc(WrappedFunc{foo})
    24  	x := func() {}
    25  	y := func() {}
    26  	var a *func()
    27  	if b {
    28  		a = &x
    29  	} else {
    30  		a = &y
    31  	}
    32  	(*a)()
    33  }
    34  
    35  // Relevant SSA:
    36  // func Foo(b bool):
    37  //         t0 = local WrappedFunc (complit)
    38  //         t1 = &t0.F [#0]
    39  //         *t1 = foo
    40  //         t2 = *t0
    41  //         t3 = callWrappedFunc(t2)
    42  //         t4 = new func() (x)
    43  //         *t4 = Foo$1
    44  //         t5 = new func() (y)
    45  //         *t5 = Foo$2
    46  //         if b goto 1 else 3
    47  // 1:
    48  //         jump 2
    49  // 2:
    50  //         t6 = phi [1: t4, 3: t5] #a
    51  //         t7 = *t6
    52  //         t8 = t7()
    53  //         return
    54  // 3:
    55  //         jump 2
    56  //
    57  // func callWrappedFunc(f WrappedFunc):
    58  //         t0 = local WrappedFunc (f)
    59  //         *t0 = f
    60  //         t1 = &t0.F [#0]
    61  //         t2 = *t1
    62  //         t3 = t2()
    63  //         return
    64  
    65  // WANT:
    66  // callWrappedFunc: t2() -> foo
    67  // Foo: callWrappedFunc(t2) -> callWrappedFunc; t7() -> Foo$1, Foo$2