GoPLS Viewer

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