aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder/reader.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/compile/internal/noder/reader.go')
-rw-r--r--src/cmd/compile/internal/noder/reader.go38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go
index ebb5043a05..e0545a86db 100644
--- a/src/cmd/compile/internal/noder/reader.go
+++ b/src/cmd/compile/internal/noder/reader.go
@@ -784,14 +784,22 @@ func (pr *pkgReader) objIdxMayFail(idx index, implicits, explicits []*types.Type
return name, nil
case pkgbits.ObjFunc:
- if sym.Name == "init" {
- sym = Renameinit()
- }
-
npos := r.pos()
setBasePos(npos)
+
+ var sel *types.Sym
+ var recv *types.Field
+ if r.Version().Has(pkgbits.GenericMethods) && r.Bool() {
+ sel = r.selector()
+ r.recvTypeParamNames()
+ recv = r.param()
+ } else {
+ if sym.Name == "init" {
+ sym = Renameinit()
+ }
+ }
r.typeParamNames()
- typ := r.signature(nil)
+ typ := r.signature(recv)
fpos := r.pos()
fn := ir.NewFunc(fpos, npos, sym, typ)
@@ -819,7 +827,7 @@ func (pr *pkgReader) objIdxMayFail(idx index, implicits, explicits []*types.Type
}
}
- rext.funcExt(name, nil)
+ rext.funcExt(name, sel)
return name, nil
case pkgbits.ObjType:
@@ -1021,7 +1029,11 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx index, implicits, explicits
}
nimplicits := r.Len()
- nexplicits := r.Len()
+ nreceivers := 0
+ if r.Version().Has(pkgbits.GenericMethods) {
+ nreceivers = r.Len()
+ }
+ nexplicits := r.Len() + nreceivers
if nimplicits > len(implicits) || nexplicits != len(explicits) {
return nil, fmt.Errorf("%v has %v+%v params, but instantiated with %v+%v args", sym, nimplicits, nexplicits, len(implicits), len(explicits))
@@ -1029,6 +1041,7 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx index, implicits, explicits
dict.targs = append(implicits[:nimplicits:nimplicits], explicits...)
dict.implicits = nimplicits
+ dict.receivers = nreceivers
// Within the compiler, we can just skip over the type parameters.
for range dict.targs[dict.implicits:] {
@@ -1095,10 +1108,19 @@ func (pr *pkgReader) objDictIdx(sym *types.Sym, idx index, implicits, explicits
return &dict, nil
}
+func (r *reader) recvTypeParamNames() {
+ r.Sync(pkgbits.SyncTypeParamNames)
+
+ for range r.dict.targs[r.dict.implicits : r.dict.implicits+r.dict.receivers] {
+ r.pos()
+ r.localIdent()
+ }
+}
+
func (r *reader) typeParamNames() {
r.Sync(pkgbits.SyncTypeParamNames)
- for range r.dict.targs[r.dict.implicits:] {
+ for range r.dict.targs[r.dict.implicits+r.dict.receivers:] {
r.pos()
r.localIdent()
}