diff options
Diffstat (limited to 'go/callgraph/vta/testdata/src/callgraph_generics.go')
-rw-r--r-- | go/callgraph/vta/testdata/src/callgraph_generics.go | 71 |
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 |