| //go:build ignore |
| // +build ignore |
| |
| // Test of a reflective call to an address-taken function. |
| // |
| // Dynamically, this program executes both print statements. |
| // RTA should report the hello methods as reachable, |
| // even though there are no dynamic calls of type func(U) |
| // and the type T is not live. |
| |
| package main |
| |
| import "reflect" |
| |
| type T int |
| type U int // to ensure the hello methods' signatures are unique |
| |
| func (T) hello(U) { println("hello") } |
| |
| type T2 int |
| |
| func (T2) Hello(U, U) { println("T2.Hello") } |
| |
| func main() { |
| u := reflect.ValueOf(U(0)) |
| |
| // reflective call to bound method closure T.hello |
| reflect.ValueOf(T(0).hello).Call([]reflect.Value{u}) |
| |
| // reflective call to exported method "Hello" of rtype T2. |
| reflect.ValueOf(T2(0)).Method(0).Call([]reflect.Value{u, u}) |
| } |
| |
| // WANT: |
| // |
| // edge (reflect.Value).Call --synthetic call--> (T).hello$bound |
| // edge (T).hello$bound --static method call--> (T).hello |
| // edge main --static function call--> reflect.ValueOf |
| // edge main --static method call--> (reflect.Value).Call |
| // edge (*T2).Hello --static method call--> (T2).Hello |
| // |
| // reachable (T).hello |
| // reachable (T).hello$bound |
| // reachable (T2).Hello |
| // |
| // !rtype T |
| // rtype T2 |
| // rtype U |