1 | //go:build ignore |
---|---|
2 | // +build ignore |
3 | |
4 | package main |
5 | |
6 | import "unsafe" |
7 | |
8 | var a int |
9 | |
10 | func 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 | |
17 | func 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 | |
26 | func 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 | |
44 | func 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. |
52 | func conv5() { |
53 | type P unsafe.Pointer |
54 | var i *struct{} |
55 | _ = P(i) |
56 | } |
57 | |
58 | func main() { |
59 | conv1() |
60 | conv2() |
61 | conv3() |
62 | conv4() |
63 | conv5() |
64 | } |
65 |
Members