mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
reflect: make StructOf panic for methods that don't work
When StructOf is used with an anonymous field that has methods, and that anonymous field is not the first field, the methods we generate are incorrect because they do not offset to the field as required. If we encounter that case, panic rather than doing the wrong thing. Fixes #20824 Updates #15924 Change-Id: I3b0901ddbc6d58af5f7e84660b5e3085a431035d Reviewed-on: https://go-review.googlesource.com/47035 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
792f9c9a95
commit
87d5f6b9f6
2 changed files with 70 additions and 33 deletions
|
|
@ -2434,7 +2434,7 @@ func StructOf(fields []StructField) Type {
|
|||
ift := (*interfaceType)(unsafe.Pointer(ft))
|
||||
for im, m := range ift.methods {
|
||||
if ift.nameOff(m.name).pkgPath() != "" {
|
||||
// TODO(sbinet)
|
||||
// TODO(sbinet). Issue 15924.
|
||||
panic("reflect: embedded interface with unexported method(s) not implemented")
|
||||
}
|
||||
|
||||
|
|
@ -2492,10 +2492,15 @@ func StructOf(fields []StructField) Type {
|
|||
case Ptr:
|
||||
ptr := (*ptrType)(unsafe.Pointer(ft))
|
||||
if unt := ptr.uncommon(); unt != nil {
|
||||
if i > 0 && unt.mcount > 0 {
|
||||
// Issue 15924.
|
||||
panic("reflect: embedded type with methods not implemented if type is not first field")
|
||||
}
|
||||
for _, m := range unt.methods() {
|
||||
mname := ptr.nameOff(m.name)
|
||||
if mname.pkgPath() != "" {
|
||||
// TODO(sbinet)
|
||||
// TODO(sbinet).
|
||||
// Issue 15924.
|
||||
panic("reflect: embedded interface with unexported method(s) not implemented")
|
||||
}
|
||||
methods = append(methods, method{
|
||||
|
|
@ -2511,6 +2516,7 @@ func StructOf(fields []StructField) Type {
|
|||
mname := ptr.nameOff(m.name)
|
||||
if mname.pkgPath() != "" {
|
||||
// TODO(sbinet)
|
||||
// Issue 15924.
|
||||
panic("reflect: embedded interface with unexported method(s) not implemented")
|
||||
}
|
||||
methods = append(methods, method{
|
||||
|
|
@ -2523,10 +2529,15 @@ func StructOf(fields []StructField) Type {
|
|||
}
|
||||
default:
|
||||
if unt := ft.uncommon(); unt != nil {
|
||||
if i > 0 && unt.mcount > 0 {
|
||||
// Issue 15924.
|
||||
panic("reflect: embedded type with methods not implemented if type is not first field")
|
||||
}
|
||||
for _, m := range unt.methods() {
|
||||
mname := ft.nameOff(m.name)
|
||||
if mname.pkgPath() != "" {
|
||||
// TODO(sbinet)
|
||||
// Issue 15924.
|
||||
panic("reflect: embedded interface with unexported method(s) not implemented")
|
||||
}
|
||||
methods = append(methods, method{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue