| //go:build ignore | |
| // +build ignore | |
| package main | |
| // Test of generic function calls. | |
| type I interface { | |
| Foo() | |
| } | |
| type A struct{} | |
| func (a A) Foo() {} | |
| type B struct{} | |
| func (b B) Foo() {} | |
| func instantiated[X I](x X) { | |
| x.Foo() | |
| } | |
| func Bar() {} | |
| func f(h func(), g func(I), k func(A), a A, b B) { | |
| h() | |
| k(a) | |
| g(b) // g:func(I) is not matched by instantiated[B]:func(B) | |
| instantiated[A](a) // static call | |
| instantiated[B](b) // static call | |
| } | |
| // WANT: | |
| // All calls | |
| // (*A).Foo --> (A).Foo | |
| // (*B).Foo --> (B).Foo | |
| // f --> Bar | |
| // f --> instantiated[main.A] | |
| // f --> instantiated[main.A] | |
| // f --> instantiated[main.B] | |
| // instantiated --> (*A).Foo | |
| // instantiated --> (*B).Foo | |
| // instantiated --> (A).Foo | |
| // instantiated --> (B).Foo | |
| // instantiated[main.A] --> (A).Foo | |
| // instantiated[main.B] --> (B).Foo |