cmd/compile: eliminate a bunch of IterFields/IterMethods calls

This is an automated rewrite of all the calls of the form:

    for f, it := IterFields(t); f != nil; f = it.Next() { ... }

Followup CLs will work on cleaning up the remaining cases.

Change-Id: Ic1005ad45ae0b50c63e815e34e507e2d2644ba1a
Reviewed-on: https://go-review.googlesource.com/20794
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/src/cmd/compile/internal/gc/align.go b/src/cmd/compile/internal/gc/align.go
index 94dca9a..8c9190d 100644
--- a/src/cmd/compile/internal/gc/align.go
+++ b/src/cmd/compile/internal/gc/align.go
@@ -17,7 +17,7 @@
 
 func offmod(t *Type) {
 	o := int32(0)
-	for f, it := IterFields(t); f != nil; f = it.Next() {
+	for _, f := range t.Fields().Slice() {
 		f.Width = int64(o)
 		o += int32(Widthptr)
 		if int64(o) >= Thearch.MAXWIDTH {
@@ -35,7 +35,7 @@
 	}
 	lastzero := int64(0)
 	var w int64
-	for f, it := IterFields(t); f != nil; f = it.Next() {
+	for _, f := range t.Fields().Slice() {
 		if f.Type == nil {
 			// broken field, just skip it so that other valid fields
 			// get a width.
@@ -387,7 +387,7 @@
 	var w int64
 
 	for _, p := range recvsParamsResults {
-		for f, it := IterFields(p(t)); f != nil; f = it.Next() {
+		for _, f := range p(t).Fields().Slice() {
 			if x := f.Width + f.Type.Width; x > w {
 				w = x
 			}
diff --git a/src/cmd/compile/internal/gc/bexport.go b/src/cmd/compile/internal/gc/bexport.go
index c539fe5..d6f3a51 100644
--- a/src/cmd/compile/internal/gc/bexport.go
+++ b/src/cmd/compile/internal/gc/bexport.go
@@ -465,7 +465,7 @@
 		// TODO(gri) Determine if they are already sorted
 		// in which case we can drop this step.
 		var methods []*Field
-		for m, it := IterMethods(t); m != nil; m = it.Next() {
+		for _, m := range t.Methods().Slice() {
 			methods = append(methods, m)
 		}
 		sort.Sort(methodbyname(methods))
@@ -565,7 +565,7 @@
 	}
 
 	p.int(countfield(t))
-	for f, it := IterFields(t); f != nil; f = it.Next() {
+	for _, f := range t.Fields().Slice() {
 		if p.trace {
 			p.tracef("\n")
 		}
@@ -594,7 +594,7 @@
 	}
 
 	p.int(countfield(t))
-	for m, it := IterFields(t); m != nil; m = it.Next() {
+	for _, m := range t.Fields().Slice() {
 		if p.trace {
 			p.tracef("\n")
 		}
@@ -655,7 +655,7 @@
 		n = -n
 	}
 	p.int(n)
-	for q, it := IterFields(params); q != nil; q = it.Next() {
+	for _, q := range params.Fields().Slice() {
 		p.param(q, n, numbered)
 	}
 }
diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go
index 722a874..ed37356 100644
--- a/src/cmd/compile/internal/gc/closure.go
+++ b/src/cmd/compile/internal/gc/closure.go
@@ -528,7 +528,7 @@
 	Curfn = xfunc
 	var fld *Node
 	var n *Node
-	for t, it := IterFields(t0.Params()); t != nil; t = it.Next() {
+	for _, t := range t0.Params().Fields().Slice() {
 		n = newname(Lookupf("a%d", i))
 		i++
 		n.Class = PPARAM
@@ -547,7 +547,7 @@
 	i = 0
 	l = nil
 	var retargs []*Node
-	for t, it := IterFields(t0.Results()); t != nil; t = it.Next() {
+	for _, t := range t0.Results().Fields().Slice() {
 		n = newname(Lookupf("r%d", i))
 		i++
 		n.Class = PPARAMOUT
diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go
index 6b65dd0..6d1e6f4 100644
--- a/src/cmd/compile/internal/gc/dcl.go
+++ b/src/cmd/compile/internal/gc/dcl.go
@@ -656,7 +656,7 @@
 	}
 
 	if t.Thistuple != 0 {
-		for ft, it := IterFields(t.Recvs()); ft != nil; ft = it.Next() {
+		for _, ft := range t.Recvs().Fields().Slice() {
 			if ft.Nname == nil || ft.Nname.Sym == nil {
 				continue
 			}
@@ -667,7 +667,7 @@
 	}
 
 	if t.Intuple != 0 {
-		for ft, it := IterFields(t.Params()); ft != nil; ft = it.Next() {
+		for _, ft := range t.Params().Fields().Slice() {
 			if ft.Nname == nil || ft.Nname.Sym == nil {
 				continue
 			}
@@ -678,7 +678,7 @@
 	}
 
 	if t.Outtuple != 0 {
-		for ft, it := IterFields(t.Results()); ft != nil; ft = it.Next() {
+		for _, ft := range t.Results().Fields().Slice() {
 			if ft.Nname == nil || ft.Nname.Sym == nil {
 				continue
 			}
@@ -803,7 +803,7 @@
 
 	seen := make(map[*Sym]bool)
 	for _, t := range ts {
-		for f, it := IterFields(t); f != nil; f = it.Next() {
+		for _, f := range t.Fields().Slice() {
 			if f.Sym == nil || f.Nname == nil || isblank(f.Nname) {
 				continue
 			}
@@ -962,7 +962,7 @@
 
 		if n.Left == nil && f.Type.Etype == TINTER {
 			// embedded interface, inline methods
-			for t1, it := IterFields(f.Type); t1 != nil; t1 = it.Next() {
+			for _, t1 := range f.Type.Fields().Slice() {
 				f = newField()
 				f.Type = t1.Type
 				f.Broke = t1.Broke
@@ -1258,7 +1258,7 @@
 	}
 
 	if pa.Etype == TSTRUCT {
-		for f, it := IterFields(pa); f != nil; f = it.Next() {
+		for _, f := range pa.Fields().Slice() {
 			if f.Sym == msym {
 				Yyerror("type %v has both field and method named %v", pa, msym)
 				return
@@ -1269,7 +1269,7 @@
 	n := Nod(ODCLFIELD, newname(msym), nil)
 	n.Type = t
 
-	for f, it := IterMethods(pa); f != nil; f = it.Next() {
+	for _, f := range pa.Methods().Slice() {
 		if msym.Name != f.Sym.Name {
 			continue
 		}
diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go
index f5c2ebd..21fc269 100644
--- a/src/cmd/compile/internal/gc/esc.go
+++ b/src/cmd/compile/internal/gc/esc.go
@@ -1386,7 +1386,7 @@
 	i := 0
 	nE := e.nodeEscState(n)
 	nE.Escretval.Set(nil) // Suspect this is not nil for indirect calls.
-	for t, it := IterFields(fntype.Results()); t != nil; t = it.Next() {
+	for _, t := range fntype.Results().Fields().Slice() {
 		src := Nod(ONAME, nil, nil)
 		buf := fmt.Sprintf(".out%d", i)
 		i++
@@ -1967,7 +1967,7 @@
 	// unless //go:noescape is given before the declaration.
 	if len(func_.Nbody.Slice()) == 0 {
 		if func_.Noescape {
-			for t, it := IterFields(func_.Type.Params()); t != nil; t = it.Next() {
+			for _, t := range func_.Type.Params().Fields().Slice() {
 				if haspointers(t.Type) {
 					t.Note = mktag(EscNone)
 				}
@@ -1981,7 +1981,7 @@
 		// but we are reusing the ability to annotate an individual function
 		// argument and pass those annotations along to importing code.
 		narg := 0
-		for t, it := IterFields(func_.Type.Params()); t != nil; t = it.Next() {
+		for _, t := range func_.Type.Params().Fields().Slice() {
 			narg++
 			if t.Type.Etype == TUINTPTR {
 				if Debug['m'] != 0 {
diff --git a/src/cmd/compile/internal/gc/export.go b/src/cmd/compile/internal/gc/export.go
index d1d38b7..ef0d856 100644
--- a/src/cmd/compile/internal/gc/export.go
+++ b/src/cmd/compile/internal/gc/export.go
@@ -294,7 +294,7 @@
 
 	switch t.Etype {
 	case TSTRUCT, TINTER:
-		for f, it := IterFields(t); f != nil; f = it.Next() {
+		for _, f := range t.Fields().Slice() {
 			dumpexporttype(f.Type)
 		}
 	case TFUNC:
@@ -313,7 +313,7 @@
 	}
 
 	var m []*Field
-	for f, it := IterMethods(t); f != nil; f = it.Next() {
+	for _, f := range t.Methods().Slice() {
 		dumpexporttype(f.Type)
 		m = append(m, f)
 	}
@@ -601,7 +601,7 @@
 				break
 			}
 			fmt.Fprintf(b, "#define %s__size %d\n", t.Sym.Name, int(t.Width))
-			for t, it := IterFields(t); t != nil; t = it.Next() {
+			for _, t := range t.Fields().Slice() {
 				if !isblanksym(t.Sym) {
 					fmt.Fprintf(b, "#define %s_%s %d\n", n.Sym.Name, t.Sym.Name, int(t.Width))
 				}
diff --git a/src/cmd/compile/internal/gc/gen.go b/src/cmd/compile/internal/gc/gen.go
index 2bae788..5f01d4d 100644
--- a/src/cmd/compile/internal/gc/gen.go
+++ b/src/cmd/compile/internal/gc/gen.go
@@ -1234,7 +1234,7 @@
 			Fatalf("struct not at offset 0")
 		}
 
-		for field, it := IterFields(t); field != nil; field = it.Next() {
+		for _, field := range t.Fields().Slice() {
 			if !visitComponents(field.Type, startOffset+field.Width, f) {
 				return false
 			}
diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go
index 82e165e..abe576e 100644
--- a/src/cmd/compile/internal/gc/inl.go
+++ b/src/cmd/compile/internal/gc/inl.go
@@ -110,7 +110,7 @@
 
 	// can't handle ... args yet
 	if Debug['l'] < 3 {
-		for t, it := IterFields(fn.Type.Params()); t != nil; t = it.Next() {
+		for _, t := range fn.Type.Params().Fields().Slice() {
 			if t.Isddd {
 				return
 			}
@@ -576,7 +576,7 @@
 
 	// temporaries for return values.
 	var m *Node
-	for t, it := IterFields(fn.Type.Results()); t != nil; t = it.Next() {
+	for _, t := range fn.Type.Results().Fields().Slice() {
 		if t != nil && t.Nname != nil && !isblank(t.Nname) {
 			m = inlvar(t.Nname)
 			typecheck(&m, Erv)
@@ -617,7 +617,7 @@
 
 	var varargtype *Type
 	varargcount := 0
-	for t, it := IterFields(fn.Type.Params()); t != nil; t = it.Next() {
+	for _, t := range fn.Type.Params().Fields().Slice() {
 		if t.Isddd {
 			variadic = true
 			varargtype = t.Type
@@ -683,7 +683,7 @@
 	if !chkargcount {
 		// 0 or 1 expression on RHS.
 		var i int
-		for t, it2 := IterFields(fn.Type.Params()); t != nil; t = it2.Next() {
+		for _, t := range fn.Type.Params().Fields().Slice() {
 			if variadic && t.Isddd {
 				vararg = tinlvar(t)
 				for i = 0; i < varargcount && li < n.List.Len(); i++ {
diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go
index dc1dbbd..14e70be 100644
--- a/src/cmd/compile/internal/gc/order.go
+++ b/src/cmd/compile/internal/gc/order.go
@@ -338,7 +338,7 @@
 
 	var l1 []*Node
 	var l2 []*Node
-	for t, it := IterFields(n.Type); t != nil; t = it.Next() {
+	for _, t := range n.Type.Fields().Slice() {
 		tmp := temp(t.Type)
 		l1 = append(l1, tmp)
 		l2 = append(l2, tmp)
diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go
index d5145de..6abb57d 100644
--- a/src/cmd/compile/internal/gc/pgen.go
+++ b/src/cmd/compile/internal/gc/pgen.go
@@ -377,7 +377,7 @@
 
 	if Curfn.Type.Outnamed {
 		// add clearing of the output parameters
-		for t, it := IterFields(Curfn.Type.Results()); t != nil; t = it.Next() {
+		for _, t := range Curfn.Type.Results().Fields().Slice() {
 			if t.Nname != nil {
 				n := Nod(OAS, t.Nname, nil)
 				typecheck(&n, Etop)
diff --git a/src/cmd/compile/internal/gc/plive.go b/src/cmd/compile/internal/gc/plive.go
index f7f5112..6403f26 100644
--- a/src/cmd/compile/internal/gc/plive.go
+++ b/src/cmd/compile/internal/gc/plive.go
@@ -938,7 +938,7 @@
 
 	case TSTRUCT:
 		var o int64
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			fieldoffset := t1.Width
 			*xoffset += fieldoffset - o
 			onebitwalktype1(t1.Type, xoffset, bv)
diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go
index 874d9e0..b5a7a97 100644
--- a/src/cmd/compile/internal/gc/reflect.go
+++ b/src/cmd/compile/internal/gc/reflect.go
@@ -241,7 +241,7 @@
 	}
 
 	var d *Node
-	for t, it := IterFields(f.Params()); t != nil; t = it.Next() {
+	for _, t := range f.Params().Fields().Slice() {
 		d = Nod(ODCLFIELD, nil, nil)
 		d.Type = t.Type
 		d.Isddd = t.Isddd
@@ -249,7 +249,7 @@
 	}
 
 	var out []*Node
-	for t, it := IterFields(f.Results()); t != nil; t = it.Next() {
+	for _, t := range f.Results().Fields().Slice() {
 		d = Nod(ODCLFIELD, nil, nil)
 		d.Type = t.Type
 		out = append(out, d)
@@ -356,7 +356,7 @@
 // imethods returns the methods of the interface type t, sorted by name.
 func imethods(t *Type) []*Sig {
 	var methods []*Sig
-	for f, it := IterFields(t); f != nil; f = it.Next() {
+	for _, f := range t.Fields().Slice() {
 		if f.Type.Etype != TFUNC || f.Sym == nil {
 			continue
 		}
@@ -590,7 +590,7 @@
 
 	case TSTRUCT:
 		ret = false
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			if haspointers(t1.Type) {
 				ret = true
 				break
@@ -650,7 +650,7 @@
 	case TSTRUCT:
 		// Find the last field that has pointers.
 		var lastPtrField *Field
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			if haspointers(t1.Type) {
 				lastPtrField = t1
 			}
@@ -883,7 +883,7 @@
 		return isreflexive(t.Type)
 
 	case TSTRUCT:
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			if !isreflexive(t1.Type) {
 				return false
 			}
@@ -933,7 +933,7 @@
 		return needkeyupdate(t.Type)
 
 	case TSTRUCT:
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			if needkeyupdate(t1.Type) {
 				return true
 			}
@@ -1028,15 +1028,15 @@
 		ot = dextratype(s, ot, t, 0)
 
 	case TFUNC:
-		for t1, it := IterFields(t.Recvs()); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Recvs().Fields().Slice() {
 			dtypesym(t1.Type)
 		}
 		isddd := false
-		for t1, it := IterFields(t.Params()); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Params().Fields().Slice() {
 			isddd = t1.Isddd
 			dtypesym(t1.Type)
 		}
-		for t1, it := IterFields(t.Results()); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Results().Fields().Slice() {
 			dtypesym(t1.Type)
 		}
 
@@ -1056,13 +1056,13 @@
 		ot = dextratype(s, ot, t, dataAdd)
 
 		// Array of rtype pointers follows funcType.
-		for t1, it := IterFields(t.Recvs()); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Recvs().Fields().Slice() {
 			ot = dsymptr(s, ot, dtypesym(t1.Type), 0)
 		}
-		for t1, it := IterFields(t.Params()); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Params().Fields().Slice() {
 			ot = dsymptr(s, ot, dtypesym(t1.Type), 0)
 		}
-		for t1, it := IterFields(t.Results()); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Results().Fields().Slice() {
 			ot = dsymptr(s, ot, dtypesym(t1.Type), 0)
 		}
 
@@ -1142,7 +1142,7 @@
 	case TSTRUCT:
 		n := 0
 
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			dtypesym(t1.Type)
 			n++
 		}
@@ -1155,7 +1155,7 @@
 		dataAdd := n * structfieldSize()
 		ot = dextratype(s, ot, t, dataAdd)
 
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			// ../../../../runtime/type.go:/structField
 			if t1.Sym != nil && t1.Embedded == 0 {
 				ot = dgostringptr(s, ot, t1.Sym.Name)
@@ -1521,7 +1521,7 @@
 		p.w.Repeat(elem.Width/int64(Widthptr), count-1)
 
 	case TSTRUCT:
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			p.emit(t1.Type, offset+t1.Width)
 		}
 	}
diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go
index 06e317e..b0c7c5f 100644
--- a/src/cmd/compile/internal/gc/ssa.go
+++ b/src/cmd/compile/internal/gc/ssa.go
@@ -2632,7 +2632,7 @@
 		if countfield(t) > ssa.MaxStruct {
 			return false
 		}
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			if !canSSAType(t1.Type) {
 				return false
 			}
@@ -3950,7 +3950,7 @@
 	}
 
 	var i int
-	for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+	for _, t1 := range t.Fields().Slice() {
 		if t1.Sym != f.Sym {
 			i++
 			continue
diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go
index da4d036..126959b 100644
--- a/src/cmd/compile/internal/gc/subr.go
+++ b/src/cmd/compile/internal/gc/subr.go
@@ -1570,7 +1570,7 @@
 
 	c := 0
 	if u.Etype == TSTRUCT || u.Etype == TINTER {
-		for f, it := IterFields(u); f != nil; f = it.Next() {
+		for _, f := range u.Fields().Slice() {
 			if f.Sym == s || (ignorecase && f.Type.Etype == TFUNC && f.Type.Thistuple > 0 && strings.EqualFold(f.Sym.Name, s.Name)) {
 				if save != nil {
 					*save = f
@@ -1582,7 +1582,7 @@
 
 	u = methtype(t, 0)
 	if u != nil {
-		for f, it := IterMethods(u); f != nil; f = it.Next() {
+		for _, f := range u.Methods().Slice() {
 			if f.Embedded == 0 && (f.Sym == s || (ignorecase && strings.EqualFold(f.Sym.Name, s.Name))) {
 				if save != nil {
 					*save = f
@@ -1627,7 +1627,7 @@
 		goto out
 	}
 
-	for f, it := IterFields(u); f != nil; f = it.Next() {
+	for _, f := range u.Fields().Slice() {
 		if f.Embedded == 0 || f.Sym == nil {
 			continue
 		}
@@ -1738,7 +1738,7 @@
 	}
 
 	if u.Etype == TINTER {
-		for f, it := IterFields(u); f != nil; f = it.Next() {
+		for _, f := range u.Fields().Slice() {
 			if f.Sym.Flags&SymUniq != 0 {
 				continue
 			}
@@ -1751,7 +1751,7 @@
 
 	u = methtype(t, 0)
 	if u != nil {
-		for f, it := IterMethods(u); f != nil; f = it.Next() {
+		for _, f := range u.Methods().Slice() {
 			if f.Sym.Flags&SymUniq != 0 {
 				continue
 			}
@@ -1781,7 +1781,7 @@
 		goto out
 	}
 
-	for f, it := IterFields(u); f != nil; f = it.Next() {
+	for _, f := range u.Fields().Slice() {
 		if f.Embedded == 0 {
 			continue
 		}
@@ -1802,7 +1802,7 @@
 
 	// mark top-level method symbols
 	// so that expand1 doesn't consider them.
-	for f, it := IterMethods(t); f != nil; f = it.Next() {
+	for _, f := range t.Methods().Slice() {
 		f.Sym.Flags |= SymUniq
 	}
 
@@ -1835,7 +1835,7 @@
 		ms = append(ms, f)
 	}
 
-	for f, it := IterMethods(t); f != nil; f = it.Next() {
+	for _, f := range t.Methods().Slice() {
 		f.Sym.Flags &^= SymUniq
 	}
 
@@ -1847,7 +1847,7 @@
 func structargs(tl *Type, mustname bool) []*Node {
 	var args []*Node
 	gen := 0
-	for t, it := IterFields(tl); t != nil; t = it.Next() {
+	for _, t := range tl.Fields().Slice() {
 		var n *Node
 		if mustname && (t.Sym == nil || t.Sym.Name == "_") {
 			// invent a name so that we can refer to it in the trampoline
@@ -2085,8 +2085,8 @@
 	// and then do one loop.
 
 	if t.Etype == TINTER {
-		for im, it := IterFields(iface); im != nil; im = it.Next() {
-			for tm, it2 := IterFields(t); tm != nil; tm = it2.Next() {
+		for _, im := range iface.Fields().Slice() {
+			for _, tm := range t.Fields().Slice() {
 				if tm.Sym == im.Sym {
 					if Eqtype(tm.Type, im.Type) {
 						goto found
@@ -2112,7 +2112,7 @@
 	if t != nil {
 		expandmeth(t)
 	}
-	for im, it := IterFields(iface); im != nil; im = it.Next() {
+	for _, im := range iface.Fields().Slice() {
 		if im.Broke {
 			continue
 		}
diff --git a/src/cmd/compile/internal/gc/type.go b/src/cmd/compile/internal/gc/type.go
index 9e285c0..d328d2b 100644
--- a/src/cmd/compile/internal/gc/type.go
+++ b/src/cmd/compile/internal/gc/type.go
@@ -263,13 +263,6 @@
 	return t.Fields().Iter()
 }
 
-// IterMethods returns the first method in type t's method set
-// and an Iter value to continue iterating across the rest.
-// IterMethods does not include promoted methods.
-func IterMethods(t *Type) (*Field, Iter) {
-	return t.Methods().Iter()
-}
-
 // Iter returns the first field in fs and an Iter value to continue iterating
 // across its successor fields.
 // Deprecated: New code should use Slice instead.
diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go
index 9100672..d0de083 100644
--- a/src/cmd/compile/internal/gc/typecheck.go
+++ b/src/cmd/compile/internal/gc/typecheck.go
@@ -2568,7 +2568,7 @@
 }
 
 func hasddd(t *Type) bool {
-	for tl, it := IterFields(t); tl != nil; tl = it.Next() {
+	for _, tl := range t.Fields().Slice() {
 		if tl.Isddd {
 			return true
 		}
@@ -2609,7 +2609,7 @@
 
 				tn, it := IterFields(n.Type)
 				var why string
-				for tl, it2 := IterFields(tstruct); tl != nil; tl = it2.Next() {
+				for _, tl := range tstruct.Fields().Slice() {
 					if tl.Isddd {
 						for ; tn != nil; tn = it.Next() {
 							if assignop(tn.Type, tl.Type.Type, &why) == 0 {
@@ -2671,7 +2671,7 @@
 	}
 
 	i = 0
-	for tl, it := IterFields(tstruct); tl != nil; tl = it.Next() {
+	for _, tl := range tstruct.Fields().Slice() {
 		t = tl.Type
 		if tl.Isddd {
 			if isddd {
@@ -3489,7 +3489,7 @@
 	// value of its argument, a specific implementation of I may
 	// care. The _ would suppress the assignment to that argument
 	// while generating a call, so remove it.
-	for t, it := IterFields(nt.Type.Params()); t != nil; t = it.Next() {
+	for _, t := range nt.Type.Params().Fields().Slice() {
 		if t.Sym != nil && t.Sym.Name == "_" {
 			t.Sym = nil
 		}
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index 69c8390..4e3079f 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -1788,7 +1788,7 @@
 // helpers for shape errors
 func dumptypes(nl *Type, what string) string {
 	s := ""
-	for l, it := IterFields(nl); l != nil; l = it.Next() {
+	for _, l := range nl.Fields().Slice() {
 		if s != "" {
 			s += ", "
 		}
@@ -1842,7 +1842,7 @@
 		// copy into temporaries.
 		var alist []*Node
 
-		for l, it := IterFields(r.Type); l != nil; l = it.Next() {
+		for _, l := range r.Type.Fields().Slice() {
 			tmp := temp(l.Type)
 			alist = append(alist, tmp)
 		}
@@ -2560,7 +2560,7 @@
 // stack memory addresses.
 func paramstoheap(params *Type, out bool) []*Node {
 	var nn []*Node
-	for t, it := IterFields(params); t != nil; t = it.Next() {
+	for _, t := range params.Fields().Slice() {
 		v := t.Nname
 		if v != nil && v.Sym != nil && strings.HasPrefix(v.Sym.Name, "~r") { // unnamed result
 			v = nil
@@ -2603,7 +2603,7 @@
 // back to the stack.
 func returnsfromheap(params *Type) []*Node {
 	var nn []*Node
-	for t, it := IterFields(params); t != nil; t = it.Next() {
+	for _, t := range params.Fields().Slice() {
 		v := t.Nname
 		if v == nil || v.Class != PHEAP|PPARAMOUT {
 			continue
@@ -3223,7 +3223,7 @@
 		// Inline comparisons.
 		var li *Node
 		var ri *Node
-		for t1, it := IterFields(t); t1 != nil; t1 = it.Next() {
+		for _, t1 := range t.Fields().Slice() {
 			if isblanksym(t1.Sym) {
 				continue
 			}