// 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