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