GoPLS Viewer

Home|gopls/go/pointer/testdata/arrays_go117.go
1//go:build ignore
2// +build ignore
3
4package main
5
6// Forked from arrays.go. Requires go1.17 to parse slice to array casts.
7// TODO(taking): Merge back into arrays.go once we can assume go1.17.
8
9var unknown bool // defeat dead-code elimination
10
11var ab int
12
13func array1() {
14    sliceA := make([]*int10// @line a1make
15    sliceA[0] = &a
16
17    var sliceB []*int
18    sliceB = append(sliceB, &b// @line a1append
19
20    print(sliceA)    // @pointsto makeslice@a1make:16
21    print(sliceA[0]) // @pointsto command-line-arguments.a
22
23    print(sliceB)      // @pointsto append@a1append:17
24    print(sliceB[100]) // @pointsto command-line-arguments.b
25}
26
27func array2() {
28    sliceA := make([]*int10// @line a2make
29    sliceA[0] = &a
30
31    sliceB := sliceA[:]
32
33    print(sliceA)    // @pointsto makeslice@a2make:16
34    print(sliceA[0]) // @pointsto command-line-arguments.a
35
36    print(sliceB)    // @pointsto makeslice@a2make:16
37    print(sliceB[0]) // @pointsto command-line-arguments.a
38}
39
40func array3() {
41    a := []interface{}{""1}
42    b := []interface{}{true, func() {}}
43    print(a[0]) // @types string | int
44    print(b[0]) // @types bool | func()
45}
46
47// Test of append, copy, slice.
48func array4() {
49    var s2 struct { // @line a4L0
50        a [3]int
51        b struct{ cd int }
52    }
53    var sl1 = make([]*int10// @line a4make
54    var someint int            // @line a4L1
55    sl1[1] = &someint
56    sl2 := append(sl1, &s2.a[1]) // @line a4append1
57    print(sl1)                   // @pointsto makeslice@a4make:16
58    print(sl2)                   // @pointsto append@a4append1:15 | makeslice@a4make:16
59    print(sl1[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
60    print(sl2[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
61
62    // In z=append(x,y) we should observe flow from y[*] to x[*].
63    var sl3 = make([]*int10// @line a4L2
64    _ = append(sl3, &s2.a[1])
65    print(sl3)    // @pointsto makeslice@a4L2:16
66    print(sl3[0]) // @pointsto s2.a[*]@a4L0:6
67
68    var sl4 = []*int{&a// @line a4L3
69    sl4a := append(sl4)  // @line a4L4
70    print(sl4a)          // @pointsto slicelit@a4L3:18 | append@a4L4:16
71    print(&sl4a[0])      // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16
72    print(sl4a[0])       // @pointsto command-line-arguments.a
73
74    var sl5 = []*int{&b// @line a4L5
75    copy(sl5sl4)
76    print(sl5)     // @pointsto slicelit@a4L5:18
77    print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18
78    print(sl5[0])  // @pointsto command-line-arguments.b | command-line-arguments.a
79
80    var sl6 = sl5[:0]
81    print(sl6)     // @pointsto slicelit@a4L5:18
82    print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18
83    print(sl6[0])  // @pointsto command-line-arguments.b | command-line-arguments.a
84}
85
86func array5() {
87    var arr [2]*int
88    arr[0] = &a
89    arr[1] = &b
90
91    var n int
92    print(arr[n]) // @pointsto command-line-arguments.a | command-line-arguments.b
93}
94
95func array6() {
96    var n int
97
98    sl0 := []*int{&a}
99    ap0 := (*[1]*int)(sl0)
100    ar0 := *ap0
101
102    print(ap0[n]) // @pointsto command-line-arguments.a
103    print(sl0[n]) // @pointsto command-line-arguments.a
104    print(ar0[n]) // @pointsto command-line-arguments.a
105
106    sl1 := []*int{&a}
107    ap1 := (*[1]*int)(sl1)
108    ar1 := *ap1
109
110    ar1[0] = &b
111    print(ap1[n]) // @pointsto command-line-arguments.a
112    print(sl1[n]) // @pointsto command-line-arguments.a
113    print(ar1[n]) // @pointsto command-line-arguments.a | command-line-arguments.b
114
115    sl2 := []*int{&a}
116    ap2 := (*[1]*int)(sl2)
117    ar2 := *ap2
118
119    ap2[0] = &b
120    print(ap2[n]) // @pointsto command-line-arguments.a | command-line-arguments.b
121    print(sl2[n]) // @pointsto command-line-arguments.a | command-line-arguments.b
122    print(ar2[n]) // @pointsto command-line-arguments.a | command-line-arguments.b
123
124    sl3 := []*int{&bnil}
125    ap3 := (*[1]*int)(sl3)
126    ar3 := *ap3
127
128    print(sl3[n]) // @pointsto command-line-arguments.b
129    print(ap3[n]) // @pointsto command-line-arguments.b
130    print(ar3[n]) // @pointsto command-line-arguments.b
131}
132
133func array7() {
134    var n int
135
136    sl0 := []*int{nilnilnil}
137    ap0 := (*[2]*int)(sl0)
138    ap1 := (*[1]*int)(sl0[2:])
139
140    ap1[0] = &a
141
142    print(sl0[n]) // @pointsto command-line-arguments.a
143    print(ap0[n]) // @pointsto command-line-arguments.a
144    print(ap1[n]) // @pointsto command-line-arguments.a
145}
146
147func array8() {
148    var n int
149
150    sl1 := make([]*int11)
151    sl2 := make([]*int11)
152    pa1 := (*[1]*int)(sl1)
153    pa2 := (*[1]*int)(sl2)
154    sl1[0] = &a
155    sl2[0] = &b
156    print(pa1[n]) // @pointsto command-line-arguments.a
157    print(pa2[n]) // @pointsto command-line-arguments.b
158
159    pa2 = pa1
160    print(pa1[n]) // @pointsto command-line-arguments.a
161    print(pa2[n]) // @pointsto command-line-arguments.a
162}
163
164func main() {
165    array1()
166    array2()
167    array3()
168    array4()
169    array5()
170    array6()
171    array7()
172    array8()
173}
174
MembersX
array6.sl0
array6.ap0
array8.n
array6.ar3
array8.pa1
array7.ap1
array8.sl1
array1.BlockStmt.sliceA
array6
array6.ap2
array7
array6.sl2
array6.sl3
array6.ap3
array7.ap0
array3.BlockStmt.a
array3.BlockStmt.b
array4.BlockStmt.sl4a
array5.BlockStmt.arr
array8.sl2
array5.BlockStmt.n
array6.sl1
array6.ar2
array2.BlockStmt.sliceA
array4.BlockStmt.someint
array6.ap1
array7.sl0
array1.BlockStmt.sliceB
array4.BlockStmt.sl2
array7.n
array8.pa2
array6.n
array6.ar0
array6.ar1
array8
Members
X