mirror of
https://github.com/golang/go
synced 2024-11-17 06:04:47 -07:00
cmd/compile: don't create or instantiate methods on shape types
We should never use or need methods on non-interface shape types. We do have corresponding functions instantiated with the appropriate shape types that take the dictionary and the shape-based receiver as the first two arguments. Each such function has the same name as what the corresponding method would be, so it's best not to create the methods (which would create confusion for import/export). This fixes issue 48414, which happened because of the confusion between these two functions/methods. Fixes #48414 Change-Id: I401fbdad791bdb5792617449cad68aa8df1d9911 Reviewed-on: https://go-review.googlesource.com/c/go/+/351114 Trust: Dan Scales <danscales@google.com> Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
f6f6621312
commit
48cf96c256
@ -356,6 +356,13 @@ func methods(t *types.Type) []*typeSig {
|
||||
|
||||
// imethods returns the methods of the interface type t, sorted by name.
|
||||
func imethods(t *types.Type) []*typeSig {
|
||||
if t.HasShape() && !t.IsInterface() {
|
||||
// Non-interface shape types have no methods. (There are
|
||||
// corresponding functions (created by getInstantiation) that take
|
||||
// the dictionary and the receiver of shape type as the first two
|
||||
// arguments.)
|
||||
return nil
|
||||
}
|
||||
var methods []*typeSig
|
||||
for _, f := range t.AllMethods().Slice() {
|
||||
if f.Type.Kind() != types.TFUNC || f.Sym == nil {
|
||||
|
@ -1867,6 +1867,11 @@ func substInstType(t *types.Type, baseType *types.Type, targs []*types.Type) {
|
||||
}
|
||||
t.SetUnderlying(subst.Typ(baseType.Underlying()))
|
||||
|
||||
if t.HasShape() && !t.IsInterface() {
|
||||
// Concrete shape types have no methods.
|
||||
return
|
||||
}
|
||||
|
||||
newfields := make([]*types.Field, baseType.Methods().Len())
|
||||
for i, f := range baseType.Methods().Slice() {
|
||||
if !f.IsMethod() || types.IsInterfaceMethod(f.Type) {
|
||||
@ -1903,8 +1908,9 @@ func substInstType(t *types.Type, baseType *types.Type, targs []*types.Type) {
|
||||
newfields[i].Nname = nname
|
||||
}
|
||||
t.Methods().Set(newfields)
|
||||
if !t.HasTParam() && t.Kind() != types.TINTER && t.Methods().Len() > 0 {
|
||||
// Generate all the methods for a new fully-instantiated type.
|
||||
if !t.HasTParam() && !t.HasShape() && t.Kind() != types.TINTER && t.Methods().Len() > 0 {
|
||||
// Generate all the methods for a new fully-instantiated,
|
||||
// non-interface, non-shape type.
|
||||
NeedInstType(t)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user