golang.org/x/tools@v0.21.1-0.20240520172518-788d39e776b1/go/callgraph/vta/testdata/src/callgraph_issue_57756.go (about) 1 // Copyright 2023 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 // Test that the values of a named function type are correctly 10 // flowing from interface objects i in i.Foo() to the receiver 11 // parameters of callees of i.Foo(). 12 13 type H func() 14 15 func (h H) Do() { 16 h() 17 } 18 19 type I interface { 20 Do() 21 } 22 23 func Bar() I { 24 return H(func() {}) 25 } 26 27 func For(g G) { 28 b := Bar() 29 b.Do() 30 31 g[0] = b 32 g.Goo() 33 } 34 35 type G []I 36 37 func (g G) Goo() { 38 g[0].Do() 39 } 40 41 // Relevant SSA: 42 // func Bar$1(): 43 // return 44 // 45 // func Bar() I: 46 // t0 = changetype H <- func() (Bar$1) 47 // t1 = make I <- H (t0) 48 // 49 // func For(): 50 // t0 = Bar() 51 // t1 = invoke t0.Do() 52 // t2 = &g[0:int] 53 // *t2 = t0 54 // t3 = (G).Goo(g) 55 // 56 // func (h H) Do(): 57 // t0 = h() 58 // 59 // func (g G) Goo(): 60 // t0 = &g[0:int] 61 // t1 = *t0 62 // t2 = invoke t1.Do() 63 64 // WANT: 65 // For: (G).Goo(g) -> G.Goo; Bar() -> Bar; invoke t0.Do() -> H.Do 66 // H.Do: h() -> Bar$1 67 // G.Goo: invoke t1.Do() -> H.Do