Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / go / pointer / testdata / conv.go
1 // +build ignore
2
3 package main
4
5 import "unsafe"
6
7 var a int
8
9 func conv1() {
10         // Conversions of channel direction.
11         ch := make(chan int)    // @line c1make
12         print((<-chan int)(ch)) // @pointsto makechan@c1make:12
13         print((chan<- int)(ch)) // @pointsto makechan@c1make:12
14 }
15
16 func conv2() {
17         // string -> []byte/[]rune conversion
18         s := "foo"
19         ba := []byte(s) // @line c2ba
20         ra := []rune(s) // @line c2ra
21         print(ba)       // @pointsto convert@c2ba:14
22         print(ra)       // @pointsto convert@c2ra:14
23 }
24
25 func conv3() {
26         // Conversion of same underlying types.
27         type PI *int
28         pi := PI(&a)
29         print(pi) // @pointsto main.a
30
31         pint := (*int)(pi)
32         print(pint) // @pointsto main.a
33
34         // Conversions between pointers to identical base types.
35         var y *PI = &pi
36         var x **int = (**int)(y)
37         print(*x) // @pointsto main.a
38         print(*y) // @pointsto main.a
39         y = (*PI)(x)
40         print(*y) // @pointsto main.a
41 }
42
43 func conv4() {
44         // Handling of unsafe.Pointer conversion is unsound:
45         // we lose the alias to main.a and get something like new(int) instead.
46         p := (*int)(unsafe.Pointer(&a)) // @line c2p
47         print(p)                        // @pointsto convert@c2p:13
48 }
49
50 // Regression test for b/8231.
51 func conv5() {
52         type P unsafe.Pointer
53         var i *struct{}
54         _ = P(i)
55 }
56
57 func main() {
58         conv1()
59         conv2()
60         conv3()
61         conv4()
62         conv5()
63 }