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 / maps.go
1 // +build ignore
2
3 package main
4
5 // Test of maps.
6
7 var a, b, c int
8
9 func maps1() {
10         m1 := map[*int]*int{&a: &b} // @line m1m1
11         m2 := make(map[*int]*int)   // @line m1m2
12         m2[&b] = &a
13
14         print(m1[nil]) // @pointsto main.b | main.c
15         print(m2[nil]) // @pointsto main.a
16
17         print(m1) // @pointsto makemap@m1m1:21
18         print(m2) // @pointsto makemap@m1m2:12
19
20         m1[&b] = &c
21
22         for k, v := range m1 {
23                 print(k) // @pointsto main.a | main.b
24                 print(v) // @pointsto main.b | main.c
25         }
26
27         for k, v := range m2 {
28                 print(k) // @pointsto main.b
29                 print(v) // @pointsto main.a
30         }
31
32         // Lookup doesn't create any aliases.
33         print(m2[&c]) // @pointsto main.a
34         if _, ok := m2[&a]; ok {
35                 print(m2[&c]) // @pointsto main.a
36         }
37 }
38
39 func maps2() {
40         m1 := map[*int]*int{&a: &b}
41         m2 := map[*int]*int{&b: &c}
42         _ = []map[*int]*int{m1, m2} // (no spurious merging of m1, m2)
43
44         print(m1[nil]) // @pointsto main.b
45         print(m2[nil]) // @pointsto main.c
46 }
47
48 var g int
49
50 func maps3() {
51         // Regression test for a constraint generation bug for map range
52         // loops in which the key is unused: the (ok, k, v) tuple
53         // returned by ssa.Next may have type 'invalid' for the k and/or
54         // v components, so copying the map key or value may cause
55         // miswiring if the key has >1 components.  In the worst case,
56         // this causes a crash.  The test below used to report that
57         // pts(v) includes not just main.g but new(float64) too, which
58         // is ill-typed.
59
60         // sizeof(K) > 1, abstractly
61         type K struct{ a, b *float64 }
62         k := K{new(float64), nil}
63         m := map[K]*int{k: &g}
64
65         for _, v := range m {
66                 print(v) // @pointsto main.g
67         }
68 }
69
70 func main() {
71         maps1()
72         maps2()
73         maps3()
74 }