+++ /dev/null
-// +build ignore
-
-package main
-
-// Test of arrays & slices with reflection.
-
-import "reflect"
-
-var a, b int
-
-type S string
-
-func reflectValueSlice() {
- // reflect.Value contains a slice.
- slice := make([]*int, 10) // @line slice
- slice[0] = &a
- rvsl := reflect.ValueOf(slice).Slice(0, 0)
- print(rvsl.Interface()) // @types []*int
- print(rvsl.Interface().([]*int)) // @pointsto makeslice@slice:15
- print(rvsl.Interface().([]*int)[42]) // @pointsto main.a
-
- // reflect.Value contains an array (non-addressable).
- array := [10]*int{&a} // @line array
- rvarray := reflect.ValueOf(array).Slice(0, 0)
- print(rvarray.Interface()) // @types
- print(rvarray.Interface().([]*int)) // @pointsto
- print(rvarray.Interface().([]*int)[42]) // @pointsto
-
- // reflect.Value contains a pointer-to-array
- rvparray := reflect.ValueOf(&array).Slice(0, 0)
- print(rvparray.Interface()) // @types []*int
- print(rvparray.Interface().([]*int)) // @pointsto array@array:2
- print(rvparray.Interface().([]*int)[42]) // @pointsto main.a
-
- // reflect.Value contains a string.
- rvstring := reflect.ValueOf("hi").Slice(0, 0)
- print(rvstring.Interface()) // @types string
-
- // reflect.Value contains a (named) string type.
- rvS := reflect.ValueOf(S("hi")).Slice(0, 0)
- print(rvS.Interface()) // @types S
-
- // reflect.Value contains a non-array pointer.
- rvptr := reflect.ValueOf(new(int)).Slice(0, 0)
- print(rvptr.Interface()) // @types
-
- // reflect.Value contains a non-string basic type.
- rvint := reflect.ValueOf(3).Slice(0, 0)
- print(rvint.Interface()) // @types
-}
-
-func reflectValueBytes() {
- sl1 := make([]byte, 0) // @line ar5sl1
- sl2 := make([]byte, 0) // @line ar5sl2
-
- rvsl1 := reflect.ValueOf(sl1)
- print(rvsl1.Interface()) // @types []byte
- print(rvsl1.Interface().([]byte)) // @pointsto makeslice@ar5sl1:13
- print(rvsl1.Bytes()) // @pointsto makeslice@ar5sl1:13
-
- rvsl2 := reflect.ValueOf(123)
- rvsl2.SetBytes(sl2)
- print(rvsl2.Interface()) // @types int
- print(rvsl2.Interface().([]byte)) // @pointsto
- print(rvsl2.Bytes()) // @pointsto
-
- rvsl3 := reflect.ValueOf([]byte(nil))
- rvsl3.SetBytes(sl2)
- print(rvsl3.Interface()) // @types []byte
- print(rvsl3.Interface().([]byte)) // @pointsto makeslice@ar5sl2:13
- print(rvsl3.Bytes()) // @pointsto makeslice@ar5sl2:13
-}
-
-func reflectValueIndex() {
- slice := []*int{&a} // @line ar6slice
- rv1 := reflect.ValueOf(slice)
- print(rv1.Index(42).Interface()) // @types *int
- print(rv1.Index(42).Interface().(*int)) // @pointsto main.a
-
- array := [10]*int{&a}
- rv2 := reflect.ValueOf(array)
- print(rv2.Index(42).Interface()) // @types *int
- print(rv2.Index(42).Interface().(*int)) // @pointsto main.a
-
- rv3 := reflect.ValueOf("string")
- print(rv3.Index(42).Interface()) // @types rune
-
- rv4 := reflect.ValueOf(&array)
- print(rv4.Index(42).Interface()) // @types
-
- rv5 := reflect.ValueOf(3)
- print(rv5.Index(42).Interface()) // @types
-}
-
-func reflectValueElem() {
- // Interface.
- var iface interface{} = &a
- rv1 := reflect.ValueOf(&iface).Elem()
- print(rv1.Interface()) // @types *int
- print(rv1.Interface().(*int)) // @pointsto main.a
- print(rv1.Elem().Interface()) // @types *int
- print(rv1.Elem().Interface().(*int)) // @pointsto main.a
-
- print(reflect.ValueOf(new(interface{})).Elem().Elem()) // @types
-
- // Pointer.
- ptr := &a
- rv2 := reflect.ValueOf(&ptr)
- print(rv2.Elem().Interface()) // @types *int
- print(rv2.Elem().Interface().(*int)) // @pointsto main.a
-
- // No other type works with (rV).Elem, not even those that
- // work with (rT).Elem: slice, array, map, chan.
-
- rv3 := reflect.ValueOf([]*int{&a})
- print(rv3.Elem().Interface()) // @types
-
- rv4 := reflect.ValueOf([10]*int{&a})
- print(rv4.Elem().Interface()) // @types
-
- rv5 := reflect.ValueOf(map[*int]*int{&a: &b})
- print(rv5.Elem().Interface()) // @types
-
- ch := make(chan *int)
- ch <- &a
- rv6 := reflect.ValueOf(ch)
- print(rv6.Elem().Interface()) // @types
-
- rv7 := reflect.ValueOf(3)
- print(rv7.Elem().Interface()) // @types
-}
-
-func reflectTypeElem() {
- rt1 := reflect.TypeOf(make([]*int, 0))
- print(reflect.Zero(rt1.Elem())) // @types *int
-
- rt2 := reflect.TypeOf([10]*int{})
- print(reflect.Zero(rt2.Elem())) // @types *int
-
- rt3 := reflect.TypeOf(map[*int]*int{})
- print(reflect.Zero(rt3.Elem())) // @types *int
-
- rt4 := reflect.TypeOf(make(chan *int))
- print(reflect.Zero(rt4.Elem())) // @types *int
-
- ptr := &a
- rt5 := reflect.TypeOf(&ptr)
- print(reflect.Zero(rt5.Elem())) // @types *int
-
- rt6 := reflect.TypeOf(3)
- print(reflect.Zero(rt6.Elem())) // @types
-}
-
-func reflectPtrTo() {
- tInt := reflect.TypeOf(3)
- tPtrInt := reflect.PtrTo(tInt)
- print(reflect.Zero(tPtrInt)) // @types *int
- tPtrPtrInt := reflect.PtrTo(tPtrInt)
- print(reflect.Zero(tPtrPtrInt)) // @types **int
-}
-
-func reflectSliceOf() {
- tInt := reflect.TypeOf(3)
- tSliceInt := reflect.SliceOf(tInt)
- print(reflect.Zero(tSliceInt)) // @types []int
-}
-
-type T struct{ x int }
-
-func reflectMakeSlice() {
- rt := []reflect.Type{
- reflect.TypeOf(3),
- reflect.TypeOf([]int{}),
- reflect.TypeOf([]T{}),
- }[0]
- sl := reflect.MakeSlice(rt, 0, 0)
- print(sl) // @types []int | []T
- print(sl) // @pointsto <alloc in reflect.MakeSlice> | <alloc in reflect.MakeSlice>
- print(&sl.Interface().([]T)[0].x) // @pointsto <alloc in reflect.MakeSlice>[*].x
-}
-
-func main() {
- reflectValueSlice()
- reflectValueBytes()
- reflectValueIndex()
- reflectValueElem()
- reflectTypeElem()
- reflectPtrTo()
- reflectSliceOf()
- reflectMakeSlice()
-}