From: Dhananjay Nakrani Date: Sun, 30 Oct 2016 19:47:53 +0000 (-0700) Subject: cmd/compile: initialize Decldepth in all cases X-Git-Tag: go1.8beta1~429 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f46239b85c97ef32ef4f5c9476d77c812125b441;p=gostls13.git cmd/compile: initialize Decldepth in all cases Previously, on encountering Func.Nname.Type == nil, typecheckfunc() returned without initializing Decldepth for that func. This causes typecheckclosure() to fatal. This change ensures that we initialize Decldepth in all cases. Fixes #17588. Change-Id: I2e3c81ad52e8383395025388989e8dbf03438b68 Reviewed-on: https://go-review.googlesource.com/32415 Reviewed-by: Josh Bleecher Snyder Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 09c4a543c7..6f0f4f58e3 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -3415,6 +3415,12 @@ out: // type check function definition func typecheckfunc(n *Node) { + for _, ln := range n.Func.Dcl { + if ln.Op == ONAME && (ln.Class == PPARAM || ln.Class == PPARAMOUT) { + ln.Name.Decldepth = 1 + } + } + n.Func.Nname = typecheck(n.Func.Nname, Erv|Easgn) t := n.Func.Nname.Type if t == nil { @@ -3426,12 +3432,6 @@ func typecheckfunc(n *Node) { if rcvr != nil && n.Func.Shortname != nil { addmethod(n.Func.Shortname.Sym, t, true, n.Func.Pragma&Nointerface != 0) } - - for _, ln := range n.Func.Dcl { - if ln.Op == ONAME && (ln.Class == PPARAM || ln.Class == PPARAMOUT) { - ln.Name.Decldepth = 1 - } - } } // The result of stringtoarraylit MUST be assigned back to n, e.g. diff --git a/test/fixedbugs/issue17588.go b/test/fixedbugs/issue17588.go new file mode 100644 index 0000000000..1be57c6292 --- /dev/null +++ b/test/fixedbugs/issue17588.go @@ -0,0 +1,20 @@ +// errorcheck + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Issue 17588: internal compiler error in typecheckclosure() +// because in case of Func.Nname.Type == nil, Decldepth +// is not initialized in typecheckfunc(). This test +// produces that case. + +package p + +type F func(b T) // ERROR "T is not a type" + +func T(fn F) { + func() { + fn(nil) // If Decldepth is not initialized properly, typecheckclosure() Fatals here. + }() +}