GoPLS Viewer

Home|gopls/go/callgraph/vta/testdata/src/callgraph_field_funcs.go
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
7package testdata
8
9type WrappedFunc struct {
10    F func() complex64
11}
12
13func callWrappedFunc(f WrappedFunc) {
14    f.F()
15}
16
17func foo() complex64 {
18    println("foo")
19    return -1
20}
21
22func 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
68
MembersX
Foo.b
WrappedFunc
WrappedFunc.F
callWrappedFunc
callWrappedFunc.f
foo
Foo
Members
X