aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/compile/internal/noder')
-rw-r--r--src/cmd/compile/internal/noder/writer.go11
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)
}