diff options
Diffstat (limited to 'go/callgraph/vta/testdata/src/callgraph_issue_57756.go')
-rw-r--r-- | go/callgraph/vta/testdata/src/callgraph_issue_57756.go | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/go/callgraph/vta/testdata/src/callgraph_issue_57756.go b/go/callgraph/vta/testdata/src/callgraph_issue_57756.go new file mode 100644 index 000000000..e18f16eba --- /dev/null +++ b/go/callgraph/vta/testdata/src/callgraph_issue_57756.go @@ -0,0 +1,67 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// go:build ignore + +package testdata + +// Test that the values of a named function type are correctly +// flowing from interface objects i in i.Foo() to the receiver +// parameters of callees of i.Foo(). + +type H func() + +func (h H) Do() { + h() +} + +type I interface { + Do() +} + +func Bar() I { + return H(func() {}) +} + +func For(g G) { + b := Bar() + b.Do() + + g[0] = b + g.Goo() +} + +type G []I + +func (g G) Goo() { + g[0].Do() +} + +// Relevant SSA: +// func Bar$1(): +// return +// +// func Bar() I: +// t0 = changetype H <- func() (Bar$1) +// t1 = make I <- H (t0) +// +// func For(): +// t0 = Bar() +// t1 = invoke t0.Do() +// t2 = &g[0:int] +// *t2 = t0 +// t3 = (G).Goo(g) +// +// func (h H) Do(): +// t0 = h() +// +// func (g G) Goo(): +// t0 = &g[0:int] +// t1 = *t0 +// t2 = invoke t1.Do() + +// WANT: +// For: (G).Goo(g) -> G.Goo; Bar() -> Bar; invoke t0.Do() -> H.Do +// H.Do: h() -> Bar$1 +// G.Goo: invoke t1.Do() -> H.Do |