GoPLS Viewer

Home|gopls/go/callgraph/vta/testdata/src/closures.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 I interface {
10    Foo()
11}
12
13func Do(i I) { i.Foo() }
14
15func Baz(b boolh func(I)) {
16    var i I
17    a := func(g func(I)) {
18        g(i)
19    }
20
21    if b {
22        h = Do
23    }
24
25    a(h)
26}
27
28// Relevant SSA:
29//  func Baz(b bool, h func(I)):
30//    t0 = new I (i)
31//    t1 = make closure Baz$1 [t0]
32//    if b goto 1 else 2
33//   1:
34//         jump 2
35//   2:
36//    t2 = phi [0: h, 1: Do] #h
37//    t3 = t1(t2)
38//    return
39//
40// func Baz$1(g func(I)):
41//    t0 = *i
42//    t1 = g(t0)
43//    return
44
45// In the edge set Local(i) -> Local(t0), Local(t0) below,
46// two occurrences of t0 come from t0 in Baz and Baz$1.
47
48// WANT:
49// Function(Do) -> Local(t2)
50// Function(Baz$1) -> Local(t1)
51// Local(h) -> Local(t2)
52// Local(t0) -> Local(i)
53// Local(i) -> Local(t0), Local(t0)
54
MembersX
Baz.h
Baz.BlockStmt.i
Members
X