mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.regabi] cmd/compile: fix package-initialization order
This CL fixes package initialization order by creating the init task before the general deadcode-removal pass. It also changes noder to emit zero-initialization assignments (i.e., OAS with nil RHS) for package-block variables, so that initOrder can tell the variables still need initialization. To allow this, we need to also extend the static-init code to recognize zero-initialization assignments. This doesn't pass toolstash -cmp, because it reorders some package initialization routines. Fixes #43444. Change-Id: I0da7996a62c85e15e97ce965298127e075390a7e Reviewed-on: https://go-review.googlesource.com/c/go/+/280976 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
3a4474cdfd
commit
68e6fa4f68
6 changed files with 70 additions and 41 deletions
|
|
@ -474,24 +474,15 @@ func (p *noder) varDecl(decl *syntax.VarDecl) []ir.Node {
|
|||
p.checkUnused(pragma)
|
||||
}
|
||||
|
||||
p.setlineno(decl)
|
||||
return DeclVars(names, typ, exprs)
|
||||
}
|
||||
|
||||
// declare variables from grammar
|
||||
// new_name_list (type | [type] = expr_list)
|
||||
func DeclVars(vl []*ir.Name, t ir.Ntype, el []ir.Node) []ir.Node {
|
||||
var init []ir.Node
|
||||
doexpr := len(el) > 0
|
||||
p.setlineno(decl)
|
||||
|
||||
if len(el) == 1 && len(vl) > 1 {
|
||||
e := el[0]
|
||||
as2 := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, nil)
|
||||
as2.Rhs = []ir.Node{e}
|
||||
for _, v := range vl {
|
||||
if len(names) > 1 && len(exprs) == 1 {
|
||||
as2 := ir.NewAssignListStmt(base.Pos, ir.OAS2, nil, exprs)
|
||||
for _, v := range names {
|
||||
as2.Lhs.Append(v)
|
||||
typecheck.Declare(v, typecheck.DeclContext)
|
||||
v.Ntype = t
|
||||
v.Ntype = typ
|
||||
v.Defn = as2
|
||||
if ir.CurFunc != nil {
|
||||
init = append(init, ir.NewDecl(base.Pos, ir.ODCL, v))
|
||||
|
|
@ -501,34 +492,29 @@ func DeclVars(vl []*ir.Name, t ir.Ntype, el []ir.Node) []ir.Node {
|
|||
return append(init, as2)
|
||||
}
|
||||
|
||||
for i, v := range vl {
|
||||
for i, v := range names {
|
||||
var e ir.Node
|
||||
if doexpr {
|
||||
if i >= len(el) {
|
||||
base.Errorf("assignment mismatch: %d variables but %d values", len(vl), len(el))
|
||||
break
|
||||
}
|
||||
e = el[i]
|
||||
if i < len(exprs) {
|
||||
e = exprs[i]
|
||||
}
|
||||
|
||||
typecheck.Declare(v, typecheck.DeclContext)
|
||||
v.Ntype = t
|
||||
v.Ntype = typ
|
||||
|
||||
if e != nil || ir.CurFunc != nil || ir.IsBlank(v) {
|
||||
if ir.CurFunc != nil {
|
||||
init = append(init, ir.NewDecl(base.Pos, ir.ODCL, v))
|
||||
}
|
||||
as := ir.NewAssignStmt(base.Pos, v, e)
|
||||
init = append(init, as)
|
||||
if e != nil {
|
||||
v.Defn = as
|
||||
}
|
||||
if ir.CurFunc != nil {
|
||||
init = append(init, ir.NewDecl(base.Pos, ir.ODCL, v))
|
||||
}
|
||||
as := ir.NewAssignStmt(base.Pos, v, e)
|
||||
init = append(init, as)
|
||||
if e != nil || ir.CurFunc == nil {
|
||||
v.Defn = as
|
||||
}
|
||||
}
|
||||
|
||||
if len(el) > len(vl) {
|
||||
base.Errorf("assignment mismatch: %d variables but %d values", len(vl), len(el))
|
||||
if len(exprs) != 0 && len(names) != len(exprs) {
|
||||
base.Errorf("assignment mismatch: %d variables but %d values", len(names), len(exprs))
|
||||
}
|
||||
|
||||
return init
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue