| // +build ignore |
| |
| package main |
| |
| import "reflect" |
| |
| // |
| // This test is very sensitive to line-number perturbations! |
| |
| // Test of maps with reflection. |
| |
| var a int |
| var b bool |
| |
| func mapreflect1() { |
| m := make(map[*int]*bool) |
| m[&a] = &b |
| |
| mrv := reflect.ValueOf(m) |
| print(mrv.Interface()) // @concrete map[*int]*bool |
| print(mrv.Interface().(map[*int]*bool)) // @pointsto makemap@testdata/mapreflect.go:16:11 |
| |
| for _, k := range mrv.MapKeys() { |
| print(k.Interface()) // @concrete *int |
| print(k.Interface().(*int)) // @pointsto main.a |
| |
| v := mrv.MapIndex(k) |
| print(v.Interface()) // @concrete *bool |
| print(v.Interface().(*bool)) // @pointsto main.b |
| } |
| } |
| |
| func mapreflect2() { |
| m := make(map[*int]*bool) |
| mrv := reflect.ValueOf(m) |
| mrv.SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b)) |
| |
| print(m[nil]) // @pointsto main.b |
| |
| for _, k := range mrv.MapKeys() { |
| print(k.Interface()) // @concrete *int |
| print(k.Interface().(*int)) // @pointsto main.a |
| } |
| |
| print(reflect.Zero(reflect.TypeOf(m).Key()).Interface()) // @concrete *int |
| print(reflect.Zero(reflect.TypeOf(m).Elem()).Interface()) // @concrete *bool |
| } |
| |
| func main() { |
| mapreflect1() |
| mapreflect2() |
| } |