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.go24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go
index 4b42ae1ec3..24977ed7f0 100644
--- a/src/cmd/compile/internal/noder/reader.go
+++ b/src/cmd/compile/internal/noder/reader.go
@@ -784,6 +784,8 @@ func (r *reader) funcExt(name *ir.Name) {
fn.Pragma = r.pragmaFlag()
r.linkname(name)
+ typecheck.Func(fn)
+
if r.bool() {
fn.ABI = obj.ABI(r.uint64())
@@ -2124,7 +2126,7 @@ func (r *reader) methodWrapper(derefs int, tbase *types.Type, method *types.Fiel
// TODO(mdempsky): Use method.Pos instead?
pos := base.AutogeneratedPos
- fn := r.newWrapperFunc(pos, sym, wrapper, method, target)
+ fn := r.newWrapperFunc(pos, sym, wrapper, method)
var recv ir.Node = fn.Nname.Type().Recv().Nname.(*ir.Name)
@@ -2143,6 +2145,8 @@ func (r *reader) methodWrapper(derefs int, tbase *types.Type, method *types.Fiel
}
addTailCall(pos, fn, recv, method)
+
+ r.finishWrapperFunc(fn, target)
}
func (r *reader) methodValueWrapper(tbase *types.Type, method *types.Field, target *ir.Package) {
@@ -2167,7 +2171,7 @@ func (r *reader) methodValueWrapper(tbase *types.Type, method *types.Field, targ
// TODO(mdempsky): Use method.Pos instead?
pos := base.AutogeneratedPos
- fn := r.newWrapperFunc(pos, sym, nil, method, target)
+ fn := r.newWrapperFunc(pos, sym, nil, method)
fn.SetNeedctxt(true)
sym.Def = fn
@@ -2181,9 +2185,11 @@ func (r *reader) methodValueWrapper(tbase *types.Type, method *types.Field, targ
fn.ClosureVars = append(fn.ClosureVars, recv)
addTailCall(pos, fn, recv, method)
+
+ r.finishWrapperFunc(fn, target)
}
-func (r *reader) newWrapperFunc(pos src.XPos, sym *types.Sym, wrapper *types.Type, method *types.Field, target *ir.Package) *ir.Func {
+func (r *reader) newWrapperFunc(pos src.XPos, sym *types.Sym, wrapper *types.Type, method *types.Field) *ir.Func {
fn := ir.NewFunc(pos)
fn.SetDupok(true) // TODO(mdempsky): Leave unset for local, non-generic wrappers?
@@ -2214,11 +2220,19 @@ func (r *reader) newWrapperFunc(pos src.XPos, sym *types.Sym, wrapper *types.Typ
defParams(ir.PPARAM, sig.Params())
defParams(ir.PPARAMOUT, sig.Results())
- target.Decls = append(target.Decls, fn)
-
return fn
}
+func (r *reader) finishWrapperFunc(fn *ir.Func, target *ir.Package) {
+ typecheck.Func(fn)
+
+ ir.WithFunc(fn, func() {
+ typecheck.Stmts(fn.Body)
+ })
+
+ target.Decls = append(target.Decls, fn)
+}
+
// newWrapperType returns a copy of the given signature type, but with
// the receiver parameter type substituted with recvType.
// If recvType is nil, newWrapperType returns a signature