5 // Test of maps with reflection.
12 func reflectMapKeysIndex() {
13 m := make(map[*int]*bool) // @line mr1make
16 mrv := reflect.ValueOf(m)
17 print(mrv.Interface()) // @types map[*int]*bool
18 print(mrv.Interface().(map[*int]*bool)) // @pointsto makemap@mr1make:11
19 print(mrv) // @pointsto makeinterface:map[*int]*bool
20 print(mrv) // @types map[*int]*bool
23 print(keys) // @pointsto <alloc in (reflect.Value).MapKeys>
24 for _, k := range keys {
25 print(k) // @pointsto <alloc in (reflect.Value).MapKeys>
26 print(k) // @types *int
27 print(k.Interface()) // @types *int
28 print(k.Interface().(*int)) // @pointsto main.a
31 print(v.Interface()) // @types *bool
32 print(v.Interface().(*bool)) // @pointsto main.b
36 func reflectSetMapIndex() {
37 m := make(map[*int]*bool)
38 mrv := reflect.ValueOf(m)
39 mrv.SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b))
41 print(m[nil]) // @pointsto main.b
43 for _, k := range mrv.MapKeys() {
44 print(k.Interface()) // @types *int
45 print(k.Interface().(*int)) // @pointsto main.a
48 tmap := reflect.TypeOf(m)
49 // types.EvalNode won't let us refer to non-exported types:
50 // print(tmap) // #@types *reflect.rtype
51 print(tmap) // @pointsto map[*int]*bool
53 zmap := reflect.Zero(tmap)
54 print(zmap) // @pointsto <alloc in reflect.Zero>
55 print(zmap.Interface()) // @pointsto <alloc in reflect.Zero>
57 print(tmap.Key()) // @pointsto *int
58 print(tmap.Elem()) // @pointsto *bool
59 print(reflect.Zero(tmap.Key())) // @pointsto <alloc in reflect.Zero>
60 print(reflect.Zero(tmap.Key()).Interface()) // @pointsto <alloc in reflect.Zero>
61 print(reflect.Zero(tmap.Key()).Interface()) // @types *int
62 print(reflect.Zero(tmap.Elem())) // @pointsto <alloc in reflect.Zero>
63 print(reflect.Zero(tmap.Elem()).Interface()) // @pointsto <alloc in reflect.Zero>
64 print(reflect.Zero(tmap.Elem()).Interface()) // @types *bool
67 func reflectSetMapIndexInterface() {
68 // Exercises reflect.Value conversions to/from interfaces:
69 // a different code path than for concrete types.
70 m := make(map[interface{}]interface{})
71 reflect.ValueOf(m).SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b))
73 print(k) // @types *int
74 print(k.(*int)) // @pointsto main.a
75 print(v) // @types *bool
76 print(v.(*bool)) // @pointsto main.b
80 func reflectSetMapIndexAssignable() {
81 // SetMapIndex performs implicit assignability conversions.
85 str := reflect.ValueOf("")
87 // *int is assignable to I.
88 m1 := make(map[string]I)
89 reflect.ValueOf(m1).SetMapIndex(str, reflect.ValueOf(new(int))) // @line int
90 print(m1[""]) // @pointsto new@int:58
92 // I is assignable to I.
93 m2 := make(map[string]I)
94 reflect.ValueOf(m2).SetMapIndex(str, reflect.ValueOf(I(new(int)))) // @line I
95 print(m2[""]) // @pointsto new@I:60
97 // J is not assignable to I.
98 m3 := make(map[string]I)
99 reflect.ValueOf(m3).SetMapIndex(str, reflect.ValueOf(J(new(int))))
100 print(m3[""]) // @pointsto
103 func reflectMakeMap() {
104 t := reflect.TypeOf(map[*int]*bool(nil))
105 v := reflect.MakeMap(t)
106 print(v) // @types map[*int]*bool
107 print(v) // @pointsto <alloc in reflect.MakeMap>
111 reflectMapKeysIndex()
113 reflectSetMapIndexInterface()
114 reflectSetMapIndexAssignable()
116 // TODO(adonovan): reflect.MapOf(Type)