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 / arrays.go
1 // +build ignore
2
3 package main
4
5 var unknown bool // defeat dead-code elimination
6
7 var a, b int
8
9 func array1() {
10         sliceA := make([]*int, 10) // @line a1make
11         sliceA[0] = &a
12
13         var sliceB []*int
14         sliceB = append(sliceB, &b) // @line a1append
15
16         print(sliceA)    // @pointsto makeslice@a1make:16
17         print(sliceA[0]) // @pointsto main.a
18
19         print(sliceB)      // @pointsto append@a1append:17
20         print(sliceB[100]) // @pointsto main.b
21 }
22
23 func array2() {
24         sliceA := make([]*int, 10) // @line a2make
25         sliceA[0] = &a
26
27         sliceB := sliceA[:]
28
29         print(sliceA)    // @pointsto makeslice@a2make:16
30         print(sliceA[0]) // @pointsto main.a
31
32         print(sliceB)    // @pointsto makeslice@a2make:16
33         print(sliceB[0]) // @pointsto main.a
34 }
35
36 func array3() {
37         a := []interface{}{"", 1}
38         b := []interface{}{true, func() {}}
39         print(a[0]) // @types string | int
40         print(b[0]) // @types bool | func()
41 }
42
43 // Test of append, copy, slice.
44 func array4() {
45         var s2 struct { // @line a4L0
46                 a [3]int
47                 b struct{ c, d int }
48         }
49         var sl1 = make([]*int, 10) // @line a4make
50         var someint int            // @line a4L1
51         sl1[1] = &someint
52         sl2 := append(sl1, &s2.a[1]) // @line a4append1
53         print(sl1)                   // @pointsto makeslice@a4make:16
54         print(sl2)                   // @pointsto append@a4append1:15 | makeslice@a4make:16
55         print(sl1[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
56         print(sl2[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
57
58         // In z=append(x,y) we should observe flow from y[*] to x[*].
59         var sl3 = make([]*int, 10) // @line a4L2
60         _ = append(sl3, &s2.a[1])
61         print(sl3)    // @pointsto makeslice@a4L2:16
62         print(sl3[0]) // @pointsto s2.a[*]@a4L0:6
63
64         var sl4 = []*int{&a} // @line a4L3
65         sl4a := append(sl4)  // @line a4L4
66         print(sl4a)          // @pointsto slicelit@a4L3:18 | append@a4L4:16
67         print(&sl4a[0])      // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16
68         print(sl4a[0])       // @pointsto main.a
69
70         var sl5 = []*int{&b} // @line a4L5
71         copy(sl5, sl4)
72         print(sl5)     // @pointsto slicelit@a4L5:18
73         print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18
74         print(sl5[0])  // @pointsto main.b | main.a
75
76         var sl6 = sl5[:0]
77         print(sl6)     // @pointsto slicelit@a4L5:18
78         print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18
79         print(sl6[0])  // @pointsto main.b | main.a
80 }
81
82 func array5() {
83         var arr [2]*int
84         arr[0] = &a
85         arr[1] = &b
86
87         var n int
88         print(arr[n]) // @pointsto main.a | main.b
89 }
90
91 func main() {
92         array1()
93         array2()
94         array3()
95         array4()
96         array5()
97 }