diff options
Diffstat (limited to 'src/cmd/compile/internal/noder/reader.go')
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 38 |
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() } |
