diff --git a/_demo/go/reflectfunc/reflectfunc.go b/_demo/go/reflectfunc/reflectfunc.go index 7b2f7f11..363ae3d2 100644 --- a/_demo/go/reflectfunc/reflectfunc.go +++ b/_demo/go/reflectfunc/reflectfunc.go @@ -39,4 +39,12 @@ func main() { panic(fmt.Sprintf("not func: %T", fn)) } } + v := reflect.ValueOf(T{}) + if v.Field(0).Kind() != reflect.Func { + panic("must func") + } +} + +type T struct { + fn func(int) } diff --git a/runtime/internal/lib/reflect/value.go b/runtime/internal/lib/reflect/value.go index 4bee6de3..4cec494d 100644 --- a/runtime/internal/lib/reflect/value.go +++ b/runtime/internal/lib/reflect/value.go @@ -600,8 +600,13 @@ func (v Value) Field(i int) Value { field := &tt.Fields[i] typ := field.Typ + // Check closure to func + kind := typ.Kind() + if typ.IsClosure() { + kind = abi.Func + } // Inherit permission bits from v, but clear flagEmbedRO. - fl := v.flag&(flagStickyRO|flagIndir|flagAddr) | flag(typ.Kind()) + fl := v.flag&(flagStickyRO|flagIndir|flagAddr) | flag(kind) // Using an unexported field forces flagRO. if !field.Exported() { if field.Embedded() {