aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
authorMark Freeman <mark@golang.org>2026-03-30 14:46:38 -0400
committerGopher Robot <gobot@golang.org>2026-03-31 15:09:29 -0700
commit836b0984ee0b930c02ca62f9e8801f1016c9b253 (patch)
treed3c3e4497ef1ba931a3f685785548ffdf08deec3 /src/cmd/compile/internal/noder
parent085187dc17f9a335569780ab475fbbbb14d6fad0 (diff)
downloadgo-836b0984ee0b930c02ca62f9e8801f1016c9b253.tar.xz
cmd/compile/internal/noder: qualify identifiers for generic methods
Generic methods will be hoisted to objects so that they can get their own dictionaries. We need to avoid name collisions, so within a package, we qualify generic methods using their defining type. We don't differentiate method identifiers by whether they have a pointer or value receiver for simplicity. Change-Id: Ied06c5e4a4c5a6f8de8027358ddbe38fc40ae452 Reviewed-on: https://go-review.googlesource.com/c/go/+/761263 Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Mark Freeman <markfreeman@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
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)
}