--- /dev/null
+// +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
+}