mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: do not declare func nodes
The primary responsibility of declare() to associate a symbol (Sym) with a declaration (Node), so "oldname" will work. Function literals are anonymous, so their symbols does not need to be declared. Passes toolstash-check. Change-Id: I739b1054e3953e85fbd74a99148b9cfd7e5a57eb Reviewed-on: https://go-review.googlesource.com/c/go/+/249078 Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
ace37d35f1
commit
a4171d85d7
6 changed files with 13 additions and 26 deletions
|
|
@ -429,8 +429,7 @@ func hashfor(t *types.Type) *Node {
|
|||
}
|
||||
|
||||
n := newname(sym)
|
||||
n.SetClass(PFUNC)
|
||||
n.Sym.SetFunc(true)
|
||||
setNodeNameFunc(n)
|
||||
n.Type = functype(nil, []*Node{
|
||||
anonfield(types.NewPtr(t)),
|
||||
anonfield(types.Types[TUINTPTR]),
|
||||
|
|
|
|||
|
|
@ -107,18 +107,7 @@ func typecheckclosure(clo *Node, top int) {
|
|||
}
|
||||
|
||||
xfunc.Func.Nname.Sym = closurename(Curfn)
|
||||
disableExport(xfunc.Func.Nname.Sym)
|
||||
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)
|
||||
}
|
||||
setNodeNameFunc(xfunc.Func.Nname)
|
||||
xfunc = typecheck(xfunc, ctxStmt)
|
||||
|
||||
// Type check the body now, but only if we're inside a function.
|
||||
|
|
@ -473,7 +462,6 @@ func makepartialcall(fn *Node, t0 *types.Type, meth *types.Sym) *Node {
|
|||
tfn.List.Set(structargs(t0.Params(), true))
|
||||
tfn.Rlist.Set(structargs(t0.Results(), false))
|
||||
|
||||
disableExport(sym)
|
||||
xfunc := dclfunc(sym, tfn)
|
||||
xfunc.Func.SetDupok(true)
|
||||
xfunc.Func.SetNeedctxt(true)
|
||||
|
|
|
|||
|
|
@ -985,10 +985,14 @@ func makefuncsym(s *types.Sym) {
|
|||
}
|
||||
}
|
||||
|
||||
// disableExport prevents sym from being included in package export
|
||||
// data. To be effectual, it must be called before declare.
|
||||
func disableExport(sym *types.Sym) {
|
||||
sym.SetOnExportList(true)
|
||||
// setNodeNameFunc marks a node as a function.
|
||||
func setNodeNameFunc(n *Node) {
|
||||
if n.Op != ONAME || n.Class() != Pxxx {
|
||||
Fatalf("expected ONAME/Pxxx node, got %v", n)
|
||||
}
|
||||
|
||||
n.SetClass(PFUNC)
|
||||
n.Sym.SetFunc(true)
|
||||
}
|
||||
|
||||
func dclfunc(sym *types.Sym, tfn *Node) *Node {
|
||||
|
|
@ -1000,7 +1004,7 @@ func dclfunc(sym *types.Sym, tfn *Node) *Node {
|
|||
fn.Func.Nname = newfuncnamel(lineno, sym)
|
||||
fn.Func.Nname.Name.Defn = fn
|
||||
fn.Func.Nname.Name.Param.Ntype = tfn
|
||||
declare(fn.Func.Nname, PFUNC)
|
||||
setNodeNameFunc(fn.Func.Nname)
|
||||
funchdr(fn)
|
||||
fn.Func.Nname.Name.Param.Ntype = typecheck(fn.Func.Nname.Name.Param.Ntype, ctxType)
|
||||
return fn
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ func fninit(n []*Node) {
|
|||
if len(nf) > 0 {
|
||||
lineno = nf[0].Pos // prolog/epilog gets line number of first init stmt
|
||||
initializers := lookup("init")
|
||||
disableExport(initializers)
|
||||
fn := dclfunc(initializers, nod(OTFUNC, nil, nil))
|
||||
for _, dcl := range dummyInitFn.Func.Dcl {
|
||||
dcl.Name.Curfn = fn
|
||||
|
|
|
|||
|
|
@ -1543,7 +1543,6 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym) {
|
|||
tfn.List.Set(structargs(method.Type.Params(), true))
|
||||
tfn.Rlist.Set(structargs(method.Type.Results(), false))
|
||||
|
||||
disableExport(newnam)
|
||||
fn := dclfunc(newnam, tfn)
|
||||
fn.Func.SetDupok(true)
|
||||
|
||||
|
|
@ -1631,8 +1630,7 @@ func hashmem(t *types.Type) *Node {
|
|||
sym := Runtimepkg.Lookup("memhash")
|
||||
|
||||
n := newname(sym)
|
||||
n.SetClass(PFUNC)
|
||||
n.Sym.SetFunc(true)
|
||||
setNodeNameFunc(n)
|
||||
n.Type = functype(nil, []*Node{
|
||||
anonfield(types.NewPtr(t)),
|
||||
anonfield(types.Types[TUINTPTR]),
|
||||
|
|
|
|||
|
|
@ -3166,8 +3166,7 @@ func eqfor(t *types.Type) (n *Node, needsize bool) {
|
|||
case ASPECIAL:
|
||||
sym := typesymprefix(".eq", t)
|
||||
n := newname(sym)
|
||||
n.SetClass(PFUNC)
|
||||
n.Sym.SetFunc(true)
|
||||
setNodeNameFunc(n)
|
||||
n.Type = functype(nil, []*Node{
|
||||
anonfield(types.NewPtr(t)),
|
||||
anonfield(types.NewPtr(t)),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue