mirror of
https://github.com/golang/go
synced 2024-11-23 04:00:03 -07:00
cmd/compile/internal/types2: respect IgnoreFuncBodies for function literals
Updates #45783. Change-Id: Id552a60f262e2da62125acd6aec0901a82f5a29a Reviewed-on: https://go-review.googlesource.com/c/go/+/313650 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
9f601690da
commit
be28caf0aa
@ -1132,18 +1132,20 @@ func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKin
|
||||
|
||||
case *syntax.FuncLit:
|
||||
if sig, ok := check.typ(e.Type).(*Signature); ok {
|
||||
// Anonymous functions are considered part of the
|
||||
// init expression/func declaration which contains
|
||||
// them: use existing package-level declaration info.
|
||||
decl := check.decl // capture for use in closure below
|
||||
iota := check.iota // capture for use in closure below (#22345)
|
||||
// Don't type-check right away because the function may
|
||||
// be part of a type definition to which the function
|
||||
// body refers. Instead, type-check as soon as possible,
|
||||
// but before the enclosing scope contents changes (#22992).
|
||||
check.later(func() {
|
||||
check.funcBody(decl, "<function literal>", sig, e.Body, iota)
|
||||
})
|
||||
if !check.conf.IgnoreFuncBodies && e.Body != nil {
|
||||
// Anonymous functions are considered part of the
|
||||
// init expression/func declaration which contains
|
||||
// them: use existing package-level declaration info.
|
||||
decl := check.decl // capture for use in closure below
|
||||
iota := check.iota // capture for use in closure below (#22345)
|
||||
// Don't type-check right away because the function may
|
||||
// be part of a type definition to which the function
|
||||
// body refers. Instead, type-check as soon as possible,
|
||||
// but before the enclosing scope contents changes (#22992).
|
||||
check.later(func() {
|
||||
check.funcBody(decl, "<function literal>", sig, e.Body, iota)
|
||||
})
|
||||
}
|
||||
x.mode = value
|
||||
x.typ = sig
|
||||
} else {
|
||||
|
@ -13,6 +13,10 @@ import (
|
||||
)
|
||||
|
||||
func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body *syntax.BlockStmt, iota constant.Value) {
|
||||
if check.conf.IgnoreFuncBodies {
|
||||
panic("internal error: function body not ignored")
|
||||
}
|
||||
|
||||
if check.conf.Trace {
|
||||
check.trace(body.Pos(), "--- %s: %s", name, sig)
|
||||
defer func() {
|
||||
|
Loading…
Reference in New Issue
Block a user