GoPLS Viewer

Home|gopls/go/callgraph/vta/testdata/src/function_alias.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 Doer func()
10
11type A struct {
12    foo func()
13    do  Doer
14}
15
16func 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)
75
MembersX
Doer
A.do
Baz.f
Baz.BlockStmt.k
Members
X