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 I interface { |
10 | Foo() |
11 | } |
12 | |
13 | func Do(i I) { i.Foo() } |
14 | |
15 | func Baz(b bool, h 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 |