]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] cmd/compile: change noder.declNames to returns ir.Names
authorMatthew Dempsky <mdempsky@google.com>
Sat, 19 Dec 2020 04:49:50 +0000 (20:49 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 22 Dec 2020 17:04:04 +0000 (17:04 +0000)
declNames always returns a slice of *ir.Names, so return that directly
rather than as []ir.Node.

While here, also change iimport to directly create ir.ODCL/ir.OAS
statements, rather than calling variter. Allows eliminating a use of
ir.TypeNode.

Passes buildall w/ toolstash -cmp.

Change-Id: Icb75e993c4957b6050c797ba64ee71cfb7a19644
Reviewed-on: https://go-review.googlesource.com/c/go/+/279315
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/compile/internal/gc/dcl.go
src/cmd/compile/internal/gc/embed.go
src/cmd/compile/internal/gc/iimport.go
src/cmd/compile/internal/gc/noder.go

index 04e3506dbacb656dbf871b1664a0dc1285869195..09d2e7d8b78c7ec09b2eff4409efc92e8e236008 100644 (file)
@@ -130,17 +130,16 @@ func declare(n *ir.Name, ctxt ir.Class) {
 
 // declare variables from grammar
 // new_name_list (type | [type] = expr_list)
-func variter(vl []ir.Node, t ir.Ntype, el []ir.Node) []ir.Node {
+func variter(vl []*ir.Name, t ir.Ntype, el []ir.Node) []ir.Node {
        var init []ir.Node
        doexpr := len(el) > 0
 
        if len(el) == 1 && len(vl) > 1 {
                e := el[0]
                as2 := ir.Nod(ir.OAS2, nil, nil)
-               as2.PtrList().Set(vl)
                as2.PtrRlist().Set1(e)
                for _, v := range vl {
-                       v := v.(*ir.Name)
+                       as2.PtrList().Append(v)
                        declare(v, dclcontext)
                        v.Ntype = t
                        v.Defn = as2
@@ -152,17 +151,14 @@ func variter(vl []ir.Node, t ir.Ntype, el []ir.Node) []ir.Node {
                return append(init, as2)
        }
 
-       nel := len(el)
-       for _, v := range vl {
-               v := v.(*ir.Name)
+       for i, v := range vl {
                var e ir.Node
                if doexpr {
-                       if len(el) == 0 {
-                               base.Errorf("assignment mismatch: %d variables but %d values", len(vl), nel)
+                       if i >= len(el) {
+                               base.Errorf("assignment mismatch: %d variables but %d values", len(vl), len(el))
                                break
                        }
-                       e = el[0]
-                       el = el[1:]
+                       e = el[i]
                }
 
                declare(v, dclcontext)
@@ -180,8 +176,8 @@ func variter(vl []ir.Node, t ir.Ntype, el []ir.Node) []ir.Node {
                }
        }
 
-       if len(el) != 0 {
-               base.Errorf("assignment mismatch: %d variables but %d values", len(vl), nel)
+       if len(el) > len(vl) {
+               base.Errorf("assignment mismatch: %d variables but %d values", len(vl), len(el))
        }
        return init
 }
index 0d4ce83716458e90c135a0a7d7670f78dfbd918f..ea23e26069444c0cc4c30d0428ad3944d34319fe 100644 (file)
@@ -24,7 +24,7 @@ const (
        embedFiles
 )
 
-func varEmbed(p *noder, names []ir.Node, typ ir.Ntype, exprs []ir.Node, embeds []PragmaEmbed) (newExprs []ir.Node) {
+func varEmbed(p *noder, names []*ir.Name, typ ir.Ntype, exprs []ir.Node, embeds []PragmaEmbed) (newExprs []ir.Node) {
        haveEmbed := false
        for _, decl := range p.file.DeclList {
                imp, ok := decl.(*syntax.ImportDecl)
@@ -66,7 +66,7 @@ func varEmbed(p *noder, names []ir.Node, typ ir.Ntype, exprs []ir.Node, embeds [
                return exprs
        }
 
-       v := names[0].(*ir.Name)
+       v := names[0]
        Target.Embeds = append(Target.Embeds, v)
        v.Embed = new([]ir.Embed)
        for _, e := range embeds {
index 219ce4bdef271ba9c5ec891a68172de03d14e34a..cd66d39b66792b72eba3da3311d3b621b2742bd3 100644 (file)
@@ -972,8 +972,14 @@ func (r *importReader) node() ir.Node {
        case ir.ODCL:
                pos := r.pos()
                lhs := ir.NewDeclNameAt(pos, ir.ONAME, r.ident())
-               typ := ir.TypeNode(r.typ())
-               return npos(pos, liststmt(variter([]ir.Node{lhs}, typ, nil))) // TODO(gri) avoid list creation
+               lhs.SetType(r.typ())
+
+               declare(lhs, ir.PAUTO)
+
+               var stmts ir.Nodes
+               stmts.Append(ir.Nod(ir.ODCL, lhs, nil))
+               stmts.Append(ir.Nod(ir.OAS, lhs, nil))
+               return npos(pos, liststmt(stmts.Slice()))
 
        // case OAS, OASWB:
        //      unreachable - mapped to OAS case below by exporter
index b61f19ae2e9e13c38afd7dc44ded8a8951da18cf..97a9ac4396194ac51348f32378c95f9538a73f83 100644 (file)
@@ -441,7 +441,6 @@ func (p *noder) constDecl(decl *syntax.ConstDecl, cs *constState) []ir.Node {
 
        nn := make([]ir.Node, 0, len(names))
        for i, n := range names {
-               n := n.(*ir.Name)
                if i >= len(values) {
                        base.Errorf("missing value in const declaration")
                        break
@@ -492,8 +491,8 @@ func (p *noder) typeDecl(decl *syntax.TypeDecl) ir.Node {
        return nod
 }
 
-func (p *noder) declNames(op ir.Op, names []*syntax.Name) []ir.Node {
-       nodes := make([]ir.Node, 0, len(names))
+func (p *noder) declNames(op ir.Op, names []*syntax.Name) []*ir.Name {
+       nodes := make([]*ir.Name, 0, len(names))
        for _, name := range names {
                nodes = append(nodes, p.declName(op, name))
        }