diff --git a/src/cmd/compile/internal/noder/stencil.go b/src/cmd/compile/internal/noder/stencil.go index bc142e6985..772fcca46a 100644 --- a/src/cmd/compile/internal/noder/stencil.go +++ b/src/cmd/compile/internal/noder/stencil.go @@ -626,7 +626,7 @@ func (g *irgen) getInstantiation(nameNode *ir.Name, shapes []*types.Type, isMeth shapes = s1 } - sym := typecheck.MakeFuncInstSym(nameNode.Sym(), shapes, isMeth) + sym := typecheck.MakeFuncInstSym(nameNode.Sym(), shapes, false, isMeth) info := g.instInfoMap[sym] if info == nil { // If instantiation doesn't exist yet, create it and add diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go index 44919c2a4b..295dc2cdfa 100644 --- a/src/cmd/compile/internal/reflectdata/reflect.go +++ b/src/cmd/compile/internal/reflectdata/reflect.go @@ -1927,7 +1927,7 @@ func methodWrapper(rcvr *types.Type, method *types.Field, forItab bool) *obj.LSy } targs = targs2 - sym := typecheck.MakeFuncInstSym(ir.MethodSym(methodrcvr, method.Sym), targs, true) + sym := typecheck.MakeFuncInstSym(ir.MethodSym(methodrcvr, method.Sym), targs, false, true) if sym.Def == nil { // Currently we make sure that we have all the instantiations // we need by generating them all in ../noder/stencil.go:instantiateMethods diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go index 9bd8e35a13..77119ce9bd 100644 --- a/src/cmd/compile/internal/typecheck/iimport.go +++ b/src/cmd/compile/internal/typecheck/iimport.go @@ -1867,11 +1867,6 @@ 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) { @@ -1895,7 +1890,7 @@ func substInstType(t *types.Type, baseType *types.Type, targs []*types.Type) { } t2 := msubst.Typ(f.Type) oldsym := f.Nname.Sym() - newsym := MakeFuncInstSym(oldsym, targs, true) + newsym := MakeFuncInstSym(oldsym, targs, true, true) var nname *ir.Name if newsym.Def != nil { nname = newsym.Def.(*ir.Name) diff --git a/src/cmd/compile/internal/typecheck/subr.go b/src/cmd/compile/internal/typecheck/subr.go index fbfe1b3720..56e6ec0e27 100644 --- a/src/cmd/compile/internal/typecheck/subr.go +++ b/src/cmd/compile/internal/typecheck/subr.go @@ -962,8 +962,8 @@ func makeInstName1(name string, targs []*types.Type, hasBrackets bool) string { } // MakeFuncInstSym makes the unique sym for a stenciled generic function or method, -// based on the name of the function fnsym and the targs. It replaces any -// existing bracket type list in the name. MakeInstName asserts that fnsym has +// based on the name of the function gf and the targs. It replaces any +// existing bracket type list in the name. MakeInstName asserts that gf has // brackets in its name if and only if hasBrackets is true. // // Names of declared generic functions have no brackets originally, so hasBrackets @@ -973,8 +973,19 @@ func makeInstName1(name string, targs []*types.Type, hasBrackets bool) string { // // The standard naming is something like: 'genFn[int,bool]' for functions and // '(*genType[int,bool]).methodName' for methods -func MakeFuncInstSym(gf *types.Sym, targs []*types.Type, hasBrackets bool) *types.Sym { - return gf.Pkg.Lookup(makeInstName1(gf.Name, targs, hasBrackets)) +// +// isMethodNode specifies if the name of a method node is being generated (as opposed +// to a name of an instantiation of generic function or name of the shape-based +// function that helps implement a method of an instantiated type). For method nodes +// on shape types, we prepend "nofunc.", because method nodes for shape types will +// have no body, and we want to avoid a name conflict with the shape-based function +// that helps implement the same method for fully-instantiated types. +func MakeFuncInstSym(gf *types.Sym, targs []*types.Type, isMethodNode, hasBrackets bool) *types.Sym { + nm := makeInstName1(gf.Name, targs, hasBrackets) + if targs[0].HasShape() && isMethodNode { + nm = "nofunc." + nm + } + return gf.Pkg.Lookup(nm) } func MakeDictSym(gf *types.Sym, targs []*types.Type, hasBrackets bool) *types.Sym { @@ -1262,7 +1273,7 @@ func (ts *Tsubster) typ1(t *types.Type) *types.Type { for i, f := range t.Methods().Slice() { t2 := ts.typ1(f.Type) oldsym := f.Nname.Sym() - newsym := MakeFuncInstSym(oldsym, ts.Targs, true) + newsym := MakeFuncInstSym(oldsym, ts.Targs, true, true) var nname *ir.Name if newsym.Def != nil { nname = newsym.Def.(*ir.Name)