Convert Node.Isddd to a boolean and simplify usage.
- Node.Isddd converted to bool
- Type.Isddd converted to bool
- mkinlcall converted to take isddd as a bool
- typecheckaste converted to take isddd as a bool
- ascompatte converted to take isddd as a bool
Change-Id: I52586145619c44182bb0c2c5d80a0a3fe3e50a07
Reviewed-on: https://go-review.googlesource.com/7172
Reviewed-by: Keith Randall <khr@golang.org>
        i := 0
        var l *NodeList
        var callargs *NodeList
-       ddd := 0
+       ddd := false
        xfunc := Nod(ODCLFUNC, nil, nil)
        Curfn = xfunc
        var fld *Node
                xfunc.Dcl = list(xfunc.Dcl, n)
                callargs = list(callargs, n)
                fld = Nod(ODCLFIELD, n, typenod(t.Type))
-               if t.Isddd != 0 {
-                       fld.Isddd = 1
-                       ddd = 1
+               if t.Isddd {
+                       fld.Isddd = true
+                       ddd = true
                }
 
                l = list(l, fld)
 
        call := Nod(OCALL, Nod(OXDOT, ptr, meth), nil)
        call.List = callargs
-       call.Isddd = uint8(ddd)
+       call.Isddd = ddd
        if t0.Outtuple == 0 {
                body = list(body, call)
        } else {
 
                        n.Right.Op = OTARRAY
                        n.Right.Right = n.Right.Left
                        n.Right.Left = nil
-                       n.Isddd = 1
+                       n.Isddd = true
                        if n.Left != nil {
-                               n.Left.Isddd = 1
+                               n.Left.Isddd = true
                        }
                }
 
 
                escassign(e, &e.theSink, n.Left)
 
        case OAPPEND:
-               if n.Isddd == 0 {
+               if !n.Isddd {
                        for ll = n.List.Next; ll != nil; ll = ll.Next {
                                escassign(e, &e.theSink, ll.N) // lose track of assign to dereference
                        }
                var src *Node
                for lr = fn.Ntype.List; ll != nil && lr != nil; (func() { ll = ll.Next; lr = lr.Next })() {
                        src = ll.N
-                       if lr.N.Isddd != 0 && n.Isddd == 0 {
+                       if lr.N.Isddd && !n.Isddd {
                                // Introduce ODDDARG node to represent ... allocation.
                                src = Nod(ODDDARG, nil, nil)
 
        var a *Node
        for t := getinargx(fntype).Type; ll != nil; ll = ll.Next {
                src = ll.N
-               if t.Isddd != 0 && n.Isddd == 0 {
+               if t.Isddd && !n.Isddd {
                        // Introduce ODDDARG node to represent ... allocation.
                        src = Nod(ODDDARG, nil, nil)
 
 
                fp += fmt.Sprintf(" dd(%d)", n.Dodata)
        }
 
-       if n.Isddd != 0 {
-               fp += fmt.Sprintf(" isddd(%d)", n.Isddd)
+       if n.Isddd {
+               fp += fmt.Sprintf(" isddd(%v)", n.Isddd)
        }
 
        if n.Implicit {
                        }
                }
 
-               if t.Isddd != 0 {
+               if t.Isddd {
                        fp += fmt.Sprintf("...%v", Tconv(t.Type.Type, 0))
                } else {
                        fp += fmt.Sprintf("%v", Tconv(t.Type, 0))
                if n.Left != nil {
                        return fmt.Sprintf("%v(%v)", Oconv(int(n.Op), obj.FmtSharp), Nconv(n.Left, 0))
                }
-               if n.Isddd != 0 {
+               if n.Isddd {
                        return fmt.Sprintf("%v(%v...)", Oconv(int(n.Op), obj.FmtSharp), Hconv(n.List, obj.FmtComma))
                }
                var f string
                OCALLMETH:
                var f string
                f += exprfmt(n.Left, nprec)
-               if n.Isddd != 0 {
+               if n.Isddd {
                        f += fmt.Sprintf("(%v...)", Hconv(n.List, obj.FmtComma))
                        return f
                }
 
        Local       uint8 // created in this file
        Deferwidth  uint8
        Broke       uint8 // broken type definition.
-       Isddd       uint8 // TFIELD is ... argument
+       Isddd       bool  // TFIELD is ... argument
        Align       uint8
        Haspointers uint8 // 0 unknown, 1 no, 2 yes
 
 
        {
                $$ = Nod(OCALL, $1, nil);
                $$.List = $3;
-               $$.Isddd = 1;
+               $$.Isddd = true;
        }
 
 pexpr_no_paren:
                if $1 != nil {
                        $$.Left = newname($1);
                }
-               $$.Isddd = 1;
+               $$.Isddd = true;
                $$.Val = $4;
        }
 
 
        // can't handle ... args yet
        if Debug['l'] < 3 {
                for t := fn.Type.Type.Down.Down.Type; t != nil; t = t.Down {
-                       if t.Isddd != 0 {
+                       if t.Isddd {
                                return
                        }
                }
                        fmt.Printf("%v:call to func %v\n", n.Line(), Nconv(n.Left, obj.FmtSign))
                }
                if n.Left.Inl != nil { // normal case
-                       mkinlcall(np, n.Left, int(n.Isddd))
+                       mkinlcall(np, n.Left, n.Isddd)
                } else if n.Left.Op == ONAME && n.Left.Left != nil && n.Left.Left.Op == OTYPE && n.Left.Right != nil && n.Left.Right.Op == ONAME { // methods called as functions
                        if n.Left.Sym.Def != nil {
-                               mkinlcall(np, n.Left.Sym.Def, int(n.Isddd))
+                               mkinlcall(np, n.Left.Sym.Def, n.Isddd)
                        }
                }
 
                        Fatal("no function definition for [%p] %v\n", n.Left.Type, Tconv(n.Left.Type, obj.FmtSign))
                }
 
-               mkinlcall(np, n.Left.Type.Nname, int(n.Isddd))
+               mkinlcall(np, n.Left.Type.Nname, n.Isddd)
        }
 
        lineno = int32(lno)
 }
 
-func mkinlcall(np **Node, fn *Node, isddd int) {
+func mkinlcall(np **Node, fn *Node, isddd bool) {
        save_safemode := safemode
 
        // imported functions may refer to unsafe as long as the
 // On return ninit has the parameter assignments, the nbody is the
 // inlined function body and list, rlist contain the input, output
 // parameters.
-func mkinlcall1(np **Node, fn *Node, isddd int) {
+func mkinlcall1(np **Node, fn *Node, isddd bool) {
        // For variadic fn.
        if fn.Inl == nil {
                return
        var varargtype *Type
        varargcount := 0
        for t := fn.Type.Type.Down.Down.Type; t != nil; t = t.Down {
-               if t.Isddd != 0 {
+               if t.Isddd {
                        variadic = true
                        varargtype = t.Type
                }
        }
 
        // but if argument is dotted too forget about variadicity.
-       if variadic && isddd != 0 {
+       if variadic && isddd {
                variadic = false
        }
 
                // 0 or 1 expression on RHS.
                var i int
                for t := getinargx(fn.Type).Type; t != nil; t = t.Down {
-                       if variadic && t.Isddd != 0 {
+                       if variadic && t.Isddd {
                                vararg = tinlvar(t)
                                for i = 0; i < varargcount && ll != nil; i++ {
                                        m = argvar(varargtype, i)
                        if ll == nil {
                                break
                        }
-                       if variadic && t.Isddd != 0 {
+                       if variadic && t.Isddd {
                                break
                        }
                        as.List = list(as.List, tinlvar(t))
                }
 
                // match varargcount arguments with variadic parameters.
-               if variadic && t != nil && t.Isddd != 0 {
+               if variadic && t != nil && t.Isddd {
                        vararg = tinlvar(t)
                        var i int
                        for i = 0; i < varargcount && ll != nil; i++ {
 
                for t1 = getthisx(t).Type; t1 != nil; t1 = t1.Down {
                        dtypesym(t1.Type)
                }
-               isddd := 0
+               isddd := false
                for t1 = getinargx(t).Type; t1 != nil; t1 = t1.Down {
-                       isddd = int(t1.Isddd)
+                       isddd = t1.Isddd
                        dtypesym(t1.Type)
                }
 
 
                ot = dcommontype(s, ot, t)
                xt = ot - 3*Widthptr
-               ot = duint8(s, ot, uint8(isddd))
+               ot = duint8(s, ot, uint8(bool2int(isddd)))
 
                // two slice headers: in and out.
                ot = int(Rnd(int64(ot), int64(Widthptr)))
 
        // arg list
        var args *NodeList
 
-       isddd := 0
+       isddd := false
        for l := in; l != nil; l = l.Next {
                args = list(args, l.N.Left)
-               isddd = int(l.N.Left.Isddd)
+               isddd = l.N.Left.Isddd
        }
 
        methodrcvr := getthisx(method.Type).Type.Type
                fn.Wrapper = true // ignore frame for panic+recover matching
                call := Nod(OCALL, dot, nil)
                call.List = args
-               call.Isddd = uint8(isddd)
+               call.Isddd = isddd
                if method.Type.Outtuple > 0 {
                        n := Nod(ORETURN, nil, nil)
                        n.List = list1(call)
 
        Dodata         uint8
        Initorder      uint8
        Used           bool
-       Isddd          uint8
+       Isddd          bool // is the argument variadic
        Readonly       bool
        Implicit       bool
        Addrtaken      bool // address taken, even if not moved to heap
 
                if l.Op == ONAME {
                        r := unsafenmagic(n)
                        if r != nil {
-                               if n.Isddd != 0 {
+                               if n.Isddd {
                                        Yyerror("invalid use of ... with builtin %v", Nconv(l, 0))
                                }
                                n = r
                n.Diag |= n.Left.Diag
                l = n.Left
                if l.Op == ONAME && l.Etype != 0 {
-                       if n.Isddd != 0 && l.Etype != OAPPEND {
+                       if n.Isddd && l.Etype != OAPPEND {
                                Yyerror("invalid use of ... with builtin %v", Nconv(l, 0))
                        }
 
                defaultlit(&n.Left, nil)
                l = n.Left
                if l.Op == OTYPE {
-                       if n.Isddd != 0 || l.Type.Bound == -100 {
+                       if n.Isddd || l.Type.Bound == -100 {
                                if l.Type.Broke == 0 {
                                        Yyerror("invalid use of ... in type conversion", l)
                                }
                        return
                }
 
-               if count(n.List) == 1 && n.Isddd == 0 {
+               if count(n.List) == 1 && !n.Isddd {
                        typecheck(&n.List.N, Erv|Efnstruct)
                } else {
                        typechecklist(n.List, Erv)
 
                descbuf := fmt.Sprintf("argument to %v", Nconv(n.Left, 0))
                desc := descbuf
-               typecheckaste(OCALL, n.Left, int(n.Isddd), getinargx(t), n.List, desc)
+               typecheckaste(OCALL, n.Left, n.Isddd, getinargx(t), n.List, desc)
                ok |= Etop
                if t.Outtuple == 0 {
                        break OpSwitch
                        return
                }
 
-               if count(args) == 1 && n.Isddd == 0 {
+               if count(args) == 1 && !n.Isddd {
                        typecheck(&args.N, Erv|Efnstruct)
                } else {
                        typechecklist(args, Erv)
                        return
                }
 
-               if n.Isddd != 0 {
+               if n.Isddd {
                        if args.Next == nil {
                                Yyerror("cannot use ... on first argument to append")
                                n.Type = nil
                if Curfn.Type.Outnamed != 0 && n.List == nil {
                        break OpSwitch
                }
-               typecheckaste(ORETURN, nil, 0, getoutargx(Curfn.Type), n.List, "return argument")
+               typecheckaste(ORETURN, nil, false, getoutargx(Curfn.Type), n.List, "return argument")
                break OpSwitch
 
        case ORETJMP:
 
 func hasddd(t *Type) bool {
        for tl := t.Type; tl != nil; tl = tl.Down {
-               if tl.Isddd != 0 {
+               if tl.Isddd {
                        return true
                }
        }
 /*
  * typecheck assignment: type list = expression list
  */
-func typecheckaste(op int, call *Node, isddd int, tstruct *Type, nl *NodeList, desc string) {
+func typecheckaste(op int, call *Node, isddd bool, tstruct *Type, nl *NodeList, desc string) {
        var t *Type
        var n *Node
        var n1 int
                                tn := n.Type.Type
                                var why string
                                for tl := tstruct.Type; tl != nil; tl = tl.Down {
-                                       if tl.Isddd != 0 {
+                                       if tl.Isddd {
                                                for ; tn != nil; tn = tn.Down {
                                                        if assignop(tn.Type, tl.Type.Type, &why) == 0 {
                                                                if call != nil {
                        goto notenough
                }
        } else {
-               if isddd == 0 {
+               if !isddd {
                        if n2 < n1-1 {
                                goto notenough
                        }
 
        for tl := tstruct.Type; tl != nil; tl = tl.Down {
                t = tl.Type
-               if tl.Isddd != 0 {
-                       if isddd != 0 {
+               if tl.Isddd {
+                       if isddd {
                                if nl == nil {
                                        goto notenough
                                }
        if nl != nil {
                goto toomany
        }
-       if isddd != 0 {
+       if isddd {
                if call != nil {
                        Yyerror("invalid use of ... in call to %v", Nconv(call, 0))
                } else {
 
                        break
                }
 
-               ll := ascompatte(int(n.Op), nil, 0, Getoutarg(Curfn.Type), n.List, 1, &n.Ninit)
+               ll := ascompatte(int(n.Op), nil, false, Getoutarg(Curfn.Type), n.List, 1, &n.Ninit)
                n.List = ll
 
        case ORETJMP:
                }
                walkexpr(&n.Left, init)
                walkexprlist(n.List, init)
-               ll := ascompatte(int(n.Op), n, int(n.Isddd), getinarg(t), n.List, 0, init)
+               ll := ascompatte(int(n.Op), n, n.Isddd, getinarg(t), n.List, 0, init)
                n.List = reorder1(ll)
                goto ret
 
                walkexpr(&n.Left, init)
                walkexprlist(n.List, init)
 
-               ll := ascompatte(int(n.Op), n, int(n.Isddd), getinarg(t), n.List, 0, init)
+               ll := ascompatte(int(n.Op), n, n.Isddd, getinarg(t), n.List, 0, init)
                n.List = reorder1(ll)
                goto ret
 
                }
                walkexpr(&n.Left, init)
                walkexprlist(n.List, init)
-               ll := ascompatte(int(n.Op), n, 0, getthis(t), list1(n.Left.Left), 0, init)
-               lr := ascompatte(int(n.Op), n, int(n.Isddd), getinarg(t), n.List, 0, init)
+               ll := ascompatte(int(n.Op), n, false, getthis(t), list1(n.Left.Left), 0, init)
+               lr := ascompatte(int(n.Op), n, n.Isddd, getinarg(t), n.List, 0, init)
                ll = concat(ll, lr)
                n.Left.Left = nil
                ullmancalc(n.Left)
                goto ret
 
        case OAPPEND:
-               if n.Isddd != 0 {
+               if n.Isddd {
                        n = appendslice(n, init) // also works for append(slice, string).
                } else {
                        n = walkappend(n, init)
  *     return expr-list
  *     func(expr-list)
  */
-func ascompatte(op int, call *Node, isddd int, nl **Type, lr *NodeList, fp int, init **NodeList) *NodeList {
+func ascompatte(op int, call *Node, isddd bool, nl **Type, lr *NodeList, fp int, init **NodeList) *NodeList {
        var savel Iter
 
        lr0 := lr
        }
 
 loop:
-       if l != nil && l.Isddd != 0 {
+       if l != nil && l.Isddd {
                // the ddd parameter must be last
                ll = structnext(&savel)
 
                // only if we are assigning a single ddd
                // argument to a ddd parameter then it is
                // passed thru unencapsulated
-               if r != nil && lr.Next == nil && isddd != 0 && Eqtype(l.Type, r.Type) {
+               if r != nil && lr.Next == nil && isddd && Eqtype(l.Type, r.Type) {
                        a = Nod(OAS, nodarg(l, fp), r)
                        a = convas(a, init)
                        nn = list(nn, a)
 
                {
                        yyVAL.node = Nod(OCALL, yyDollar[1].node, nil)
                        yyVAL.node.List = yyDollar[3].list
-                       yyVAL.node.Isddd = 1
+                       yyVAL.node.Isddd = true
                }
        case 126:
                yyDollar = yyS[yypt-1 : yypt+1]
                        if yyDollar[1].sym != nil {
                                yyVAL.node.Left = newname(yyDollar[1].sym)
                        }
-                       yyVAL.node.Isddd = 1
+                       yyVAL.node.Isddd = true
                        yyVAL.node.Val = yyDollar[4].val
                }
        case 332: