// delicate little dance. see typecheckas2
ls := n.List().Slice()
for i1, n1 := range ls {
- if n1.Name() == nil || n1.Name().Defn != n {
+ if !ir.DeclaredBy(n1, n) {
ls[i1] = typecheck(ls[i1], ctxExpr|ctxAssign)
}
}
}
if v1 != nil {
- if v1.Name() != nil && v1.Name().Defn == n {
+ if ir.DeclaredBy(v1, n) {
v1.SetType(t1)
} else if v1.Type() != nil {
if op, why := assignop(t1, v1.Type()); op == ir.OXXX {
}
if v2 != nil {
- if v2.Name() != nil && v2.Name().Defn == n {
+ if ir.DeclaredBy(v2, n) {
v2.SetType(t2)
} else if v2.Type() != nil {
if op, why := assignop(t2, v2.Type()); op == ir.OXXX {
}
// Require k to be a new variable name.
- if k.Name() == nil || k.Name().Defn != n {
+ if !ir.DeclaredBy(k, n) {
return false
}
func checkassign(stmt ir.Node, n ir.Node) {
// Variables declared in ORANGE are assigned on every iteration.
- if n.Name() == nil || n.Name().Defn != stmt || stmt.Op() == ir.ORANGE {
+ if !ir.DeclaredBy(n, stmt) || stmt.Op() == ir.ORANGE {
r := outervalue(n)
if r.Op() == ir.ONAME {
r.Name().SetAssigned(true)
// so that the conversion below happens).
n.SetLeft(resolve(n.Left()))
- if n.Left().Name() == nil || n.Left().Name().Defn != n || n.Left().Name().Ntype != nil {
+ if !ir.DeclaredBy(n.Left(), n) || n.Left().Name().Ntype != nil {
n.SetLeft(typecheck(n.Left(), ctxExpr|ctxAssign))
}
}
}
- if n.Left().Name() != nil && n.Left().Name().Defn == n && n.Left().Name().Ntype == nil {
+ if ir.DeclaredBy(n.Left(), n) && n.Left().Name().Ntype == nil {
n.SetRight(defaultlit(n.Right(), nil))
n.Left().SetType(n.Right().Type())
}
n1 = resolve(n1)
ls[i1] = n1
- if n1.Name() == nil || n1.Name().Defn != n || n1.Name().Ntype != nil {
+ if !ir.DeclaredBy(n1, n) || n1.Name().Ntype != nil {
ls[i1] = typecheck(ls[i1], ctxExpr|ctxAssign)
}
}
if nl.Type() != nil && nr.Type() != nil {
rs[il] = assignconv(nr, nl.Type(), "assignment")
}
- if nl.Name() != nil && nl.Name().Defn == n && nl.Name().Ntype == nil {
+ if ir.DeclaredBy(nl, n) && nl.Name().Ntype == nil {
rs[il] = defaultlit(rs[il], nil)
nl.SetType(rs[il].Type())
}
if f.Type != nil && l.Type() != nil {
checkassignto(f.Type, l)
}
- if l.Name() != nil && l.Name().Defn == n && l.Name().Ntype == nil {
+ if ir.DeclaredBy(l, n) && l.Name().Ntype == nil {
l.SetType(f.Type)
}
}
if l.Type() != nil {
checkassignto(r.Type(), l)
}
- if l.Name() != nil && l.Name().Defn == n {
+ if ir.DeclaredBy(l, n) {
l.SetType(r.Type())
}
l := n.List().Second()
if l.Type() != nil && !l.Type().IsBoolean() {
checkassignto(types.Types[types.TBOOL], l)
}
- if l.Name() != nil && l.Name().Defn == n && l.Name().Ntype == nil {
+ if ir.DeclaredBy(l, n) && l.Name().Ntype == nil {
l.SetType(types.Types[types.TBOOL])
}
goto out