37 lines
		
	
	
		
			659 B
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			659 B
		
	
	
	
		
			Go
		
	
	
	
// +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
 | 
						|
}
 |