ee8a7668e07b40117a7ae6933172eea964ce1dd3
[dotfiles/.git] / panic.go
1 // +build ignore
2
3 package main
4
5 // Test of value flow from panic() to recover().
6 // We model them as stores/loads of a global location.
7 // We ignore concrete panic types originating from the runtime.
8
9 var someval int
10
11 type myPanic struct{}
12
13 func f(int) {}
14
15 func g() string { return "" }
16
17 func deadcode() {
18         panic(123) // not reached
19 }
20
21 func main() {
22         switch someval {
23         case 0:
24                 panic("oops")
25         case 1:
26                 panic(myPanic{})
27         case 2:
28                 panic(f)
29         case 3:
30                 panic(g)
31         }
32         ex := recover()
33         print(ex)                 // @types myPanic | string | func(int) | func() string
34         print(ex.(func(int)))     // @pointsto main.f
35         print(ex.(func() string)) // @pointsto main.g
36 }