diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index b101818519..efa9fe13d2 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -6405,3 +6405,19 @@ func TestIssue22031(t *testing.T) { } } } + +type NonExportedFirst int + +func (i NonExportedFirst) ΦExported() {} +func (i NonExportedFirst) nonexported() int { panic("wrong") } + +func TestIssue22073(t *testing.T) { + m := ValueOf(NonExportedFirst(0)).Method(0) + + if got := m.Type().NumOut(); got != 0 { + t.Errorf("NumOut: got %v, want 0", got) + } + + // Shouldn't panic. + m.Call(nil) +} diff --git a/src/reflect/value.go b/src/reflect/value.go index 91b0e37f50..e9bfe550f4 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -584,11 +584,11 @@ func methodReceiver(op string, v Value, methodIndex int) (rcvrtype, t *rtype, fn t = tt.typeOff(m.typ) } else { rcvrtype = v.typ - ut := v.typ.uncommon() - if ut == nil || uint(i) >= uint(ut.mcount) { + ms := v.typ.exportedMethods() + if uint(i) >= uint(len(ms)) { panic("reflect: internal error: invalid method index") } - m := ut.methods()[i] + m := ms[i] if !v.typ.nameOff(m.name).isExported() { panic("reflect: " + op + " of unexported method") } @@ -1717,11 +1717,11 @@ func (v Value) Type() Type { return v.typ.typeOff(m.typ) } // Method on concrete type. - ut := v.typ.uncommon() - if ut == nil || uint(i) >= uint(ut.mcount) { + ms := v.typ.exportedMethods() + if uint(i) >= uint(len(ms)) { panic("reflect: internal error: invalid method index") } - m := ut.methods()[i] + m := ms[i] return v.typ.typeOff(m.mtyp) }