mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
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 <josharian@gmail.com> Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
741445068f
commit
f46239b85c
|
@ -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.
|
||||
|
|
20
test/fixedbugs/issue17588.go
Normal file
20
test/fixedbugs/issue17588.go
Normal file
|
@ -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.
|
||||
}()
|
||||
}
|
Loading…
Reference in a new issue