1
0
mirror of https://github.com/golang/go synced 2024-09-29 12:14:28 -06: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:
Dan Scales 2021-09-20 15:34:09 -07:00
parent f6f6621312
commit 48cf96c256
2 changed files with 15 additions and 2 deletions

View File

@ -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 {

View File

@ -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)
}
}