| //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 |