Commit 9edb27e7 authored by Emmanuel Odeke's avatar Emmanuel Odeke Committed by Brad Fitzpatrick

reflect: make Field panic when out of bounds, as documented

Fixes #15046.

Change-Id: Iba7216297735be8e1ec550ce5336d17dcd3fd6b7
Reviewed-on: https://go-review.googlesource.com/22992Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 42b647bd
......@@ -5221,6 +5221,41 @@ func TestLargeGCProg(t *testing.T) {
fv.Call([]Value{ValueOf([256]*byte{})})
}
func fieldIndexRecover(t Type, i int) (recovered interface{}) {
defer func() {
recovered = recover()
}()
t.Field(i)
return
}
// Issue 15046.
func TestTypeFieldOutOfRangePanic(t *testing.T) {
typ := TypeOf(struct{ X int }{10})
testIndices := [...]struct {
i int
mustPanic bool
}{
0: {-2, true},
1: {0, false},
2: {1, true},
3: {1 << 10, true},
}
for i, tt := range testIndices {
recoveredErr := fieldIndexRecover(typ, tt.i)
if tt.mustPanic {
if recoveredErr == nil {
t.Errorf("#%d: fieldIndex %d expected to panic", i, tt.i)
}
} else {
if recoveredErr != nil {
t.Errorf("#%d: got err=%v, expected no panic", i, recoveredErr)
}
}
}
}
// Issue 9179.
func TestCallGC(t *testing.T) {
f := func(a, b, c, d, e string) {
......
......@@ -1178,7 +1178,7 @@ func (tag StructTag) Lookup(key string) (value string, ok bool) {
// Field returns the i'th struct field.
func (t *structType) Field(i int) (f StructField) {
if i < 0 || i >= len(t.fields) {
return
panic("reflect: Field index out of bounds")
}
p := &t.fields[i]
f.Type = toType(p.typ)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment