// range
 func typecheckrange(n *Node) {
-       var toomany int
+       var toomany bool
        var why string
        var t1 *types.Type
        var t2 *types.Type
        }
        n.Type = t
 
-       toomany = 0
+       toomany = false
        switch t.Etype {
        default:
                yyerrorl(n.Pos, "cannot range over %L", n.Right)
                t1 = t.Elem()
                t2 = nil
                if n.List.Len() == 2 {
-                       toomany = 1
+                       toomany = true
                }
 
        case TSTRING:
                t2 = types.Runetype
        }
 
-       if n.List.Len() > 2 || toomany != 0 {
+       if n.List.Len() > 2 || toomany {
                yyerrorl(n.Pos, "too many variables in range")
        }
 
 
        return n
 }
 
-func ifacelookdot(s *types.Sym, t *types.Type, followptr *bool, ignorecase bool) *types.Field {
-       *followptr = false
-
+func ifacelookdot(s *types.Sym, t *types.Type, ignorecase bool) (m *types.Field, followptr bool) {
        if t == nil {
-               return nil
+               return nil, false
        }
 
-       var m *types.Field
        path, ambig := dotpath(s, t, &m, ignorecase)
        if path == nil {
                if ambig {
                        yyerror("%v.%v is ambiguous", t, s)
                }
-               return nil
+               return nil, false
        }
 
        for _, d := range path {
                if d.field.Type.IsPtr() {
-                       *followptr = true
+                       followptr = true
                        break
                }
        }
 
        if m.Type.Etype != TFUNC || m.Type.Recv() == nil {
                yyerror("%v.%v is a field, not a method", t, s)
-               return nil
+               return nil, followptr
        }
 
-       return m
+       return m, followptr
 }
 
 func implements(t, iface *types.Type, m, samename **types.Field, ptr *int) bool {
                if im.Broke() {
                        continue
                }
-               var followptr bool
-               tm := ifacelookdot(im.Sym, t, &followptr, false)
+               tm, followptr := ifacelookdot(im.Sym, t, false)
                if tm == nil || tm.Nointerface() || !eqtype(tm.Type, im.Type) {
                        if tm == nil {
-                               tm = ifacelookdot(im.Sym, t, &followptr, true)
+                               tm, followptr = ifacelookdot(im.Sym, t, true)
                        }
                        *m = im
                        *samename = tm
 
                if n.HasBreak() {
                        return false
                }
-               def := 0
+               def := false
                for _, n1 := range n.List.Slice() {
                        if !n1.Nbody.isterminating() {
                                return false
                        }
                        if n1.List.Len() == 0 { // default
-                               def = 1
+                               def = true
                        }
                }
 
-               if n.Op != OSELECT && def == 0 {
+               if n.Op != OSELECT && !def {
                        return false
                }
                return true
 
        // Also record whether there are any writes to main memory.
        // Also record whether there are any writes to variables
        // whose addresses have been taken.
-       memwrite := 0
-
-       varwrite := 0
+       memwrite := false
+       varwrite := false
        for _, an := range all[:i] {
                a := outervalue(an.Left)
 
                }
 
                if a.Op != ONAME {
-                       memwrite = 1
+                       memwrite = true
                        continue
                }
 
                switch n.Class() {
                default:
-                       varwrite = 1
+                       varwrite = true
                        continue
 
                case PAUTO, PPARAM, PPARAMOUT:
                        if n.Addrtaken() {
-                               varwrite = 1
+                               varwrite = true
                                continue
                        }
 
        // that are being written.
 
        // If no computed addresses are affected by the writes, no aliasing.
-       if memwrite == 0 && varwrite == 0 {
+       if !memwrite && !varwrite {
                return false
        }
 
        return nlen
 }
 
-func eqfor(t *types.Type, needsize *int) *Node {
+func eqfor(t *types.Type) (n *Node, needsize bool) {
        // Should only arrive here with large memory or
        // a struct/array containing a non-memory field/element.
        // Small memory is handled inline, and single non-memory
        case AMEM:
                n := syslook("memequal")
                n = substArgTypes(n, t, t)
-               *needsize = 1
-               return n
+               return n, true
        case ASPECIAL:
                sym := typesymprefix(".eq", t)
                n := newname(sym)
                ntype.Rlist.Append(anonfield(types.Types[TBOOL]))
                ntype = typecheck(ntype, Etype)
                n.Type = ntype.Type
-               *needsize = 0
-               return n
+               return n, false
        }
        Fatalf("eqfor %v", t)
-       return nil
+       return nil, false
 }
 
 // The result of walkcompare MUST be assigned back to n, e.g.
                ar = typecheck(ar, Etop)
                init.Append(ar)
 
-               var needsize int
-               call := nod(OCALL, eqfor(t, &needsize), nil)
+               fn, needsize := eqfor(t)
+               call := nod(OCALL, fn, nil)
                call.List.Append(pl)
                call.List.Append(pr)
-               if needsize != 0 {
+               if needsize {
                        call.List.Append(nodintconst(t.Width))
                }
                res := call