|  | // +build ignore | 
|  |  | 
|  | package main | 
|  |  | 
|  | import "unsafe" | 
|  |  | 
|  | var a int | 
|  |  | 
|  | func conv1() { | 
|  | // Conversions of channel direction. | 
|  | ch := make(chan int)    // @line c1make | 
|  | print((<-chan int)(ch)) // @pointsto makechan@c1make:12 | 
|  | print((chan<- int)(ch)) // @pointsto makechan@c1make:12 | 
|  | } | 
|  |  | 
|  | func conv2() { | 
|  | // string -> []byte/[]rune conversion | 
|  | s := "foo" | 
|  | ba := []byte(s) // @line c2ba | 
|  | ra := []rune(s) // @line c2ra | 
|  | print(ba)       // @pointsto convert@c2ba:14 | 
|  | print(ra)       // @pointsto convert@c2ra:14 | 
|  | } | 
|  |  | 
|  | func conv3() { | 
|  | // Conversion of same underlying types. | 
|  | type PI *int | 
|  | pi := PI(&a) | 
|  | print(pi) // @pointsto main.a | 
|  |  | 
|  | pint := (*int)(pi) | 
|  | print(pint) // @pointsto main.a | 
|  |  | 
|  | // Conversions between pointers to identical base types. | 
|  | var y *PI = &pi | 
|  | var x **int = (**int)(y) | 
|  | print(*x) // @pointsto main.a | 
|  | print(*y) // @pointsto main.a | 
|  | y = (*PI)(x) | 
|  | print(*y) // @pointsto main.a | 
|  | } | 
|  |  | 
|  | func conv4() { | 
|  | // Handling of unsafe.Pointer conversion is unsound: | 
|  | // we lose the alias to main.a and get something like new(int) instead. | 
|  | p := (*int)(unsafe.Pointer(&a)) // @line c2p | 
|  | print(p)                        // @pointsto convert@c2p:13 | 
|  | } | 
|  |  | 
|  | // Regression test for b/8231. | 
|  | func conv5() { | 
|  | type P unsafe.Pointer | 
|  | var i *struct{} | 
|  | _ = P(i) | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | conv1() | 
|  | conv2() | 
|  | conv3() | 
|  | conv4() | 
|  | conv5() | 
|  | } |