1// +build ignore 2 3package main 4 5// Test of maps. 6 7var a, b, c int 8 9func 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 39func 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 48var g int 49 50func 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 70func main() { 71 maps1() 72 maps2() 73 maps3() 74} 75