// +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) // @types myPanic | string | func(int) | func() string | |
print(ex.(func(int))) // @pointsto main.f | |
print(ex.(func() string)) // @pointsto main.g | |
} |