aboutsummaryrefslogtreecommitdiff
path: root/go/callgraph/vta/testdata/src/callgraph_issue_57756.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/callgraph/vta/testdata/src/callgraph_issue_57756.go')
-rw-r--r--go/callgraph/vta/testdata/src/callgraph_issue_57756.go67
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