diff options
| author | Mark Freeman <mark@golang.org> | 2026-03-30 14:46:38 -0400 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2026-03-31 15:09:29 -0700 |
| commit | 836b0984ee0b930c02ca62f9e8801f1016c9b253 (patch) | |
| tree | d3c3e4497ef1ba931a3f685785548ffdf08deec3 /src/cmd/compile/internal/noder | |
| parent | 085187dc17f9a335569780ab475fbbbb14d6fad0 (diff) | |
| download | go-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.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) } |
