10 m1 := map[*int]*int{&a: &b} // @line m1m1
11 m2 := make(map[*int]*int) // @line m1m2
14 print(m1[nil]) // @pointsto main.b | main.c
15 print(m2[nil]) // @pointsto main.a
17 print(m1) // @pointsto makemap@m1m1:21
18 print(m2) // @pointsto makemap@m1m2:12
22 for k, v := range m1 {
23 print(k) // @pointsto main.a | main.b
24 print(v) // @pointsto main.b | main.c
27 for k, v := range m2 {
28 print(k) // @pointsto main.b
29 print(v) // @pointsto main.a
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
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)
44 print(m1[nil]) // @pointsto main.b
45 print(m2[nil]) // @pointsto main.c
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
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}
66 print(v) // @pointsto main.g