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>
diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go
index 6dbe3cb..44919c2 100644
--- a/src/cmd/compile/internal/reflectdata/reflect.go
+++ b/src/cmd/compile/internal/reflectdata/reflect.go
@@ -356,6 +356,13 @@
 
 // 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 {
diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go
index ec4057a..57f0dd8 100644
--- a/src/cmd/compile/internal/typecheck/iimport.go
+++ b/src/cmd/compile/internal/typecheck/iimport.go
@@ -1867,6 +1867,11 @@
 	}
 	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 @@
 		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)
 	}
 }