mirror of
https://github.com/golang/go
synced 2024-11-23 09:10:08 -07:00
reflect: make Field panic when out of bounds, as documented
Fixes #15046. Change-Id: Iba7216297735be8e1ec550ce5336d17dcd3fd6b7 Reviewed-on: https://go-review.googlesource.com/22992 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
42b647bde6
commit
9edb27e76f
@ -5221,6 +5221,41 @@ func TestLargeGCProg(t *testing.T) {
|
|||||||
fv.Call([]Value{ValueOf([256]*byte{})})
|
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.
|
// Issue 9179.
|
||||||
func TestCallGC(t *testing.T) {
|
func TestCallGC(t *testing.T) {
|
||||||
f := func(a, b, c, d, e string) {
|
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.
|
// Field returns the i'th struct field.
|
||||||
func (t *structType) Field(i int) (f StructField) {
|
func (t *structType) Field(i int) (f StructField) {
|
||||||
if i < 0 || i >= len(t.fields) {
|
if i < 0 || i >= len(t.fields) {
|
||||||
return
|
panic("reflect: Field index out of bounds")
|
||||||
}
|
}
|
||||||
p := &t.fields[i]
|
p := &t.fields[i]
|
||||||
f.Type = toType(p.typ)
|
f.Type = toType(p.typ)
|
||||||
|
Loading…
Reference in New Issue
Block a user