aboutsummaryrefslogtreecommitdiff
path: root/go/callgraph/vta/testdata/src/callgraph_generics.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/callgraph/vta/testdata/src/callgraph_generics.go')
-rw-r--r--go/callgraph/vta/testdata/src/callgraph_generics.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/go/callgraph/vta/testdata/src/callgraph_generics.go b/go/callgraph/vta/testdata/src/callgraph_generics.go
new file mode 100644
index 000000000..da3dca52a
--- /dev/null
+++ b/go/callgraph/vta/testdata/src/callgraph_generics.go
@@ -0,0 +1,71 @@
+// Copyright 2021 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
+
+func instantiated[X any](x *X) int {
+ print(x)
+ return 0
+}
+
+type I interface {
+ Bar()
+}
+
+func interfaceInstantiated[X I](x X) {
+ x.Bar()
+}
+
+type A struct{}
+
+func (a A) Bar() {}
+
+type B struct{}
+
+func (b B) Bar() {}
+
+func Foo(a A, b B) {
+ x := true
+ instantiated[bool](&x)
+ y := 1
+ instantiated[int](&y)
+
+ interfaceInstantiated[A](a)
+ interfaceInstantiated[B](b)
+}
+
+// Relevant SSA:
+//func Foo(a A, b B):
+// t0 = local A (a)
+// *t0 = a
+// t1 = local B (b)
+// *t1 = b
+// t2 = new bool (x)
+// *t2 = true:bool
+// t3 = instantiated[bool](t2)
+// t4 = new int (y)
+// *t4 = 1:int
+// t5 = instantiated[int](t4)
+// t6 = *t0
+// t7 = interfaceInstantiated[testdata.A](t6)
+// t8 = *t1
+// t9 = interfaceInstantiated[testdata.B](t8)
+// return
+//
+//func interfaceInstantiated[testdata.B](x B):
+// t0 = local B (x)
+// *t0 = x
+// t1 = *t0
+// t2 = (B).Bar(t1)
+// return
+//
+//func interfaceInstantiated[X I](x X):
+// (external)
+
+// WANT:
+// Foo: instantiated[bool](t2) -> instantiated[bool]; instantiated[int](t4) -> instantiated[int]; interfaceInstantiated[testdata.A](t6) -> interfaceInstantiated[testdata.A]; interfaceInstantiated[testdata.B](t8) -> interfaceInstantiated[testdata.B]
+// interfaceInstantiated[testdata.B]: (B).Bar(t1) -> B.Bar
+// interfaceInstantiated[testdata.A]: (A).Bar(t1) -> A.Bar