// +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() }