// +build ignore package main // Test of value flow from panic() to recover(). // We model them as stores/loads of a global location. // We ignore concrete panic types originating from the runtime. var someval int type myPanic struct{} func f(int) {} func g() string { return "" } func deadcode() { panic(123) // not reached } func main() { switch someval { case 0: panic("oops") case 1: panic(myPanic{}) case 2: panic(f) case 3: panic(g) } ex := recover() print(ex) // @concrete myPanic | string | func(int) | func() string print(ex.(func(int))) // @pointsto main.f print(ex.(func() string)) // @pointsto main.g }