// 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
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)
}
}
- 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
}
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)
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 {
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
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
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))
}