mirror of
https://github.com/golang/go
synced 2024-11-23 08:10:03 -07:00
cmd/compile: don't bother to declare closure inside redeclared func
Fixes #17758 Change-Id: I75f5dc5be85fd8a6791ac89dfc0681be759cca36 Reviewed-on: https://go-review.googlesource.com/c/go/+/248517 Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
98a0071a53
commit
ac875bc923
@ -108,7 +108,17 @@ func typecheckclosure(clo *Node, top int) {
|
|||||||
|
|
||||||
xfunc.Func.Nname.Sym = closurename(Curfn)
|
xfunc.Func.Nname.Sym = closurename(Curfn)
|
||||||
disableExport(xfunc.Func.Nname.Sym)
|
disableExport(xfunc.Func.Nname.Sym)
|
||||||
declare(xfunc.Func.Nname, PFUNC)
|
if xfunc.Func.Nname.Sym.Def != nil {
|
||||||
|
// The only case we can reach here is when the outer function was redeclared.
|
||||||
|
// In that case, don't bother to redeclare the closure. Otherwise, we will get
|
||||||
|
// a spurious error message, see #17758. While we are here, double check that
|
||||||
|
// we already reported other error.
|
||||||
|
if nsavederrors+nerrors == 0 {
|
||||||
|
Fatalf("unexpected symbol collision %v", xfunc.Func.Nname.Sym)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
declare(xfunc.Func.Nname, PFUNC)
|
||||||
|
}
|
||||||
xfunc = typecheck(xfunc, ctxStmt)
|
xfunc = typecheck(xfunc, ctxStmt)
|
||||||
|
|
||||||
// Type check the body now, but only if we're inside a function.
|
// Type check the body now, but only if we're inside a function.
|
||||||
|
17
test/fixedbugs/issue17758.go
Normal file
17
test/fixedbugs/issue17758.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
// errorcheck
|
||||||
|
|
||||||
|
// Copyright 2020 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.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
func foo() {
|
||||||
|
_ = func() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
func foo() { // ERROR "foo redeclared in this block"
|
||||||
|
_ = func() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {}
|
Loading…
Reference in New Issue
Block a user