diff options
Diffstat (limited to 'src/cmd/compile/internal/noder')
| -rw-r--r-- | src/cmd/compile/internal/noder/writer.go | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go index 2632e14e31..06264f5f87 100644 --- a/src/cmd/compile/internal/noder/writer.go +++ b/src/cmd/compile/internal/noder/writer.go @@ -993,8 +993,8 @@ func (w *writer) method(wext *writer, meth *types2.Func) { wext.funcExt(meth) } -// qualifiedIdent writes out the name of an object declared at package -// scope. (For now, it's also used to refer to local defined types.) +// qualifiedIdent writes out the name of an object typically declared at package +// scope. It's also used to refer to generic methods and locally defined types. func (w *writer) qualifiedIdent(obj types2.Object) { w.Sync(pkgbits.SyncSym) @@ -1012,6 +1012,13 @@ func (w *writer) qualifiedIdent(obj types2.Object) { } } + // Generic methods are promoted to objects and thus need qualified identifiers. + // They must be contextualized by their defining type. + if isGenericMethod(obj.Type()) { + recv := types2.Unalias(deref2(obj.Type().(*types2.Signature).Recv().Type())) + name = fmt.Sprintf("%s.%s", recv.(*types2.Named).Obj().Name(), name) + } + w.pkg(obj.Pkg()) w.String(name) } |
