Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / go / pointer / testdata / arrays.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/pointer/testdata/arrays.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/pointer/testdata/arrays.go
new file mode 100644 (file)
index 0000000..e57a15b
--- /dev/null
@@ -0,0 +1,97 @@
+// +build ignore
+
+package main
+
+var unknown bool // defeat dead-code elimination
+
+var a, b int
+
+func array1() {
+       sliceA := make([]*int, 10) // @line a1make
+       sliceA[0] = &a
+
+       var sliceB []*int
+       sliceB = append(sliceB, &b) // @line a1append
+
+       print(sliceA)    // @pointsto makeslice@a1make:16
+       print(sliceA[0]) // @pointsto main.a
+
+       print(sliceB)      // @pointsto append@a1append:17
+       print(sliceB[100]) // @pointsto main.b
+}
+
+func array2() {
+       sliceA := make([]*int, 10) // @line a2make
+       sliceA[0] = &a
+
+       sliceB := sliceA[:]
+
+       print(sliceA)    // @pointsto makeslice@a2make:16
+       print(sliceA[0]) // @pointsto main.a
+
+       print(sliceB)    // @pointsto makeslice@a2make:16
+       print(sliceB[0]) // @pointsto main.a
+}
+
+func array3() {
+       a := []interface{}{"", 1}
+       b := []interface{}{true, func() {}}
+       print(a[0]) // @types string | int
+       print(b[0]) // @types bool | func()
+}
+
+// Test of append, copy, slice.
+func array4() {
+       var s2 struct { // @line a4L0
+               a [3]int
+               b struct{ c, d int }
+       }
+       var sl1 = make([]*int, 10) // @line a4make
+       var someint int            // @line a4L1
+       sl1[1] = &someint
+       sl2 := append(sl1, &s2.a[1]) // @line a4append1
+       print(sl1)                   // @pointsto makeslice@a4make:16
+       print(sl2)                   // @pointsto append@a4append1:15 | makeslice@a4make:16
+       print(sl1[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
+       print(sl2[0])                // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6
+
+       // In z=append(x,y) we should observe flow from y[*] to x[*].
+       var sl3 = make([]*int, 10) // @line a4L2
+       _ = append(sl3, &s2.a[1])
+       print(sl3)    // @pointsto makeslice@a4L2:16
+       print(sl3[0]) // @pointsto s2.a[*]@a4L0:6
+
+       var sl4 = []*int{&a} // @line a4L3
+       sl4a := append(sl4)  // @line a4L4
+       print(sl4a)          // @pointsto slicelit@a4L3:18 | append@a4L4:16
+       print(&sl4a[0])      // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16
+       print(sl4a[0])       // @pointsto main.a
+
+       var sl5 = []*int{&b} // @line a4L5
+       copy(sl5, sl4)
+       print(sl5)     // @pointsto slicelit@a4L5:18
+       print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18
+       print(sl5[0])  // @pointsto main.b | main.a
+
+       var sl6 = sl5[:0]
+       print(sl6)     // @pointsto slicelit@a4L5:18
+       print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18
+       print(sl6[0])  // @pointsto main.b | main.a
+}
+
+func array5() {
+       var arr [2]*int
+       arr[0] = &a
+       arr[1] = &b
+
+       var n int
+       print(arr[n]) // @pointsto main.a | main.b
+}
+
+func main() {
+       array1()
+       array2()
+       array3()
+       array4()
+       array5()
+}