diff --git a/src/pkg/archive/tar/reader_test.go b/src/pkg/archive/tar/reader_test.go
index cc3f8fe..4e546ce 100644
--- a/src/pkg/archive/tar/reader_test.go
+++ b/src/pkg/archive/tar/reader_test.go
@@ -147,7 +147,7 @@
 		t.Fatalf("Didn't get first file: %v", err);
 	}
 	buf := make([]byte, 4);
-	if n, err := io.ReadFull(tr, buf); err != nil {
+	if _, err := io.ReadFull(tr, buf); err != nil {
 		t.Fatalf("Unexpected error: %v", err);
 	}
 	if expected := strings.Bytes("Kilt"); !bytes.Equal(buf, expected) {
@@ -160,7 +160,7 @@
 		t.Fatalf("Didn't get second file: %v", err);
 	}
 	buf = make([]byte, 6);
-	if n, err := io.ReadFull(tr, buf); err != nil {
+	if _, err := io.ReadFull(tr, buf); err != nil {
 		t.Fatalf("Unexpected error: %v", err);
 	}
 	if expected := strings.Bytes("Google"); !bytes.Equal(buf, expected) {
diff --git a/src/pkg/archive/tar/writer_test.go b/src/pkg/archive/tar/writer_test.go
index 775882c..5669729 100644
--- a/src/pkg/archive/tar/writer_test.go
+++ b/src/pkg/archive/tar/writer_test.go
@@ -64,7 +64,7 @@
 func bytestr(offset int, b []byte) string {
 	const rowLen = 32;
 	s := fmt.Sprintf("%04x ", offset);
-	for i, ch := range b {
+	for _, ch := range b {
 		switch {
 		case '0' <= ch && ch <= '9', 'A' <= ch && ch <= 'Z', 'a' <= ch && ch <= 'z':
 			s += fmt.Sprintf("  %c", ch);
@@ -114,7 +114,7 @@
 				t.Errorf("test %d, entry %d: Failed writing header: %v", i, j, err);
 				continue testLoop
 			}
-			if n, err := io.WriteString(tw, entry.contents); err != nil {
+			if _, err := io.WriteString(tw, entry.contents); err != nil {
 				t.Errorf("test %d, entry %d: Failed writing contents: %v", i, j, err);
 				continue testLoop
 			}
diff --git a/src/pkg/base64/base64_test.go b/src/pkg/base64/base64_test.go
index 039c997..69da2df 100644
--- a/src/pkg/base64/base64_test.go
+++ b/src/pkg/base64/base64_test.go
@@ -158,7 +158,7 @@
 
 	for _, e := range examples {
 		dbuf := make([]byte, StdEncoding.DecodedLen(len(e.e)));
-		count, err := StdEncoding.Decode(strings.Bytes(e.e), dbuf);
+		_, err := StdEncoding.Decode(strings.Bytes(e.e), dbuf);
 		switch err := err.(type) {
 		case CorruptInputError:
 			testEqual(t, "Corruption in %q at offset %v, want %v", e.e, int(err), e.p);
diff --git a/src/pkg/bignum/bignum.go b/src/pkg/bignum/bignum.go
index 7d2dde6..2fc138c 100755
--- a/src/pkg/bignum/bignum.go
+++ b/src/pkg/bignum/bignum.go
@@ -591,7 +591,7 @@
 // If y == 0, a division-by-zero run-time error occurs.
 //
 func (x Natural) Div(y Natural) Natural {
-	q, r := divmod(unpack(x), unpack(y));
+	q, _ := divmod(unpack(x), unpack(y));
 	return pack(q);
 }
 
@@ -601,7 +601,7 @@
 // If y == 0, a division-by-zero run-time error occurs.
 //
 func (x Natural) Mod(y Natural) Natural {
-	q, r := divmod(unpack(x), unpack(y));
+	_, r := divmod(unpack(x), unpack(y));
 	return pack(r);
 }
 
diff --git a/src/pkg/bignum/bignum_test.go b/src/pkg/bignum/bignum_test.go
index 5b4cf8f..2b2be66 100644
--- a/src/pkg/bignum/bignum_test.go
+++ b/src/pkg/bignum/bignum_test.go
@@ -152,7 +152,7 @@
 
 	test_msg = "NatConvG";
 	x := Nat(100);
-	y, b, _ := NatFromString(fmt.Sprintf("%b", &x), 2);
+	y, _, _ := NatFromString(fmt.Sprintf("%b", &x), 2);
 	nat_eq(100, y, x);
 }
 
diff --git a/src/pkg/bufio/bufio_test.go b/src/pkg/bufio/bufio_test.go
index 7100bcf..58e4456 100644
--- a/src/pkg/bufio/bufio_test.go
+++ b/src/pkg/bufio/bufio_test.go
@@ -156,7 +156,7 @@
 					bufreader := bufreaders[j];
 					bufsize := bufsizes[k];
 					read := readmaker.fn(bytes.NewBuffer(textbytes));
-					buf, e := NewReaderSize(read, bufsize);
+					buf, _ := NewReaderSize(read, bufsize);
 					s := bufreader.fn(buf);
 					if s != text {
 						t.Errorf("reader=%s fn=%s bufsize=%d want=%q got=%q",
@@ -193,7 +193,7 @@
 	want := strings.Join(segments, "");
 	r := NewReader(&StringReader{data: segments});
 	for {
-		rune, size, err := r.ReadRune();
+		rune, _, err := r.ReadRune();
 		if err != nil {
 			if err != os.EOF {
 				return;
@@ -293,9 +293,9 @@
 }
 
 func TestWriteErrors(t *testing.T) {
-	for i, w := range errorWriterTests {
+	for _, w := range errorWriterTests {
 		buf := NewWriter(w);
-		n, e := buf.Write(strings.Bytes("hello world"));
+		_, e := buf.Write(strings.Bytes("hello world"));
 		if e != nil {
 			t.Errorf("Write hello to %v: %v", w, e);
 			continue;
diff --git a/src/pkg/bytes/buffer_test.go b/src/pkg/bytes/buffer_test.go
index 4d3fca8..bb65937 100644
--- a/src/pkg/bytes/buffer_test.go
+++ b/src/pkg/bytes/buffer_test.go
@@ -164,7 +164,7 @@
 
 		rlen := rand.Intn(len(data));
 		fub := make([]byte, rlen);
-		n, err := buf.Read(fub);
+		n, _ := buf.Read(fub);
 		s = s[n : len(s)];
 	}
 	empty(t, "TestMixedReadsAndWrites (2)", &buf, s, make([]byte, buf.Len()));
diff --git a/src/pkg/bytes/bytes.go b/src/pkg/bytes/bytes.go
index d4eb4c7..30ac458 100644
--- a/src/pkg/bytes/bytes.go
+++ b/src/pkg/bytes/bytes.go
@@ -190,8 +190,8 @@
 	maxbytes := len(s);	// length of b
 	nbytes := 0;	// number of bytes encoded in b
 	b := make([]byte, maxbytes);
-	for wid, i := 0, 0; i < len(s); i += wid {
-		wid = 1;
+	for i := 0; i < len(s); {
+		wid := 1;
 		rune := int(s[i]);
 		if rune < utf8.RuneSelf {
 			rune = mapping(rune);
@@ -209,6 +209,7 @@
 			b = nb;
 		}
 		nbytes += utf8.EncodeRune(rune, b[nbytes:maxbytes]);
+		i += wid;
 	}
 	return b[0:nbytes];
 }
@@ -232,8 +233,8 @@
 // removed, as defined by Unicode.
 func TrimSpace(s []byte) []byte {
 	start, end := 0, len(s);
-	for wid := 0; start < end; start += wid {
-		wid = 1;
+	for start < end {
+		wid := 1;
 		rune := int(s[start]);
 		if rune >= utf8.RuneSelf {
 			rune, wid = utf8.DecodeRune(s[start:end])
@@ -241,9 +242,10 @@
 		if !unicode.IsSpace(rune) {
 			break;
 		}
+		start += wid;
 	}
-	for wid := 0; start < end; end -= wid {
-		wid = 1;
+	for start < end {
+		wid := 1;
 		rune := int(s[end-1]);
 		if rune >= utf8.RuneSelf {
 			// Back up carefully looking for beginning of rune. Mustn't pass start.
@@ -257,6 +259,7 @@
 		if !unicode.IsSpace(rune) {
 			break;
 		}
+		end -= wid;
 	}
 	return s[start:end];
 }
diff --git a/src/pkg/bytes/bytes_test.go b/src/pkg/bytes/bytes_test.go
index 8443480..df4d4c2 100644
--- a/src/pkg/bytes/bytes_test.go
+++ b/src/pkg/bytes/bytes_test.go
@@ -216,7 +216,7 @@
 // Execute f on each test case.  funcName should be the name of f; it's used
 // in failure reports.
 func runStringTests(t *testing.T, f func([]byte) []byte, funcName string, testCases []StringTest) {
-	for i, tc := range testCases {
+	for _, tc := range testCases {
 		actual := string(f(Bytes(tc.in)));
 		if actual != tc.out {
 			t.Errorf("%s(%q) = %q; want %q", funcName, tc.in, actual, tc.out);
@@ -275,7 +275,7 @@
 }
 
 func TestAdd(t *testing.T) {
-	for i, test := range addtests {
+	for _, test := range addtests {
 		b := make([]byte, len(test.s), test.cap);
 		for i := 0; i < len(test.s); i++ {
 			b[i] = test.s[i]
diff --git a/src/pkg/compress/flate/inflate.go b/src/pkg/compress/flate/inflate.go
index 8195285..5415d33 100644
--- a/src/pkg/compress/flate/inflate.go
+++ b/src/pkg/compress/flate/inflate.go
@@ -121,7 +121,7 @@
 	// compute min and max length.
 	var count [maxCodeLen+1]int;
 	var min, max int;
-	for i, n := range bits {
+	for _, n := range bits {
 		if n == 0 {
 			continue;
 		}
diff --git a/src/pkg/compress/gzip/gunzip.go b/src/pkg/compress/gzip/gunzip.go
index 88147da..edf363a 100644
--- a/src/pkg/compress/gzip/gunzip.go
+++ b/src/pkg/compress/gzip/gunzip.go
@@ -116,7 +116,7 @@
 }
 
 func (z *Inflater) readHeader(save bool) os.Error {
-	n, err := io.ReadFull(z.r, z.buf[0:10]);
+	_, err := io.ReadFull(z.r, z.buf[0:10]);
 	if err != nil {
 		return err;
 	}
diff --git a/src/pkg/compress/gzip/gunzip_test.go b/src/pkg/compress/gzip/gunzip_test.go
index 699a1b5..67b2579 100644
--- a/src/pkg/compress/gzip/gunzip_test.go
+++ b/src/pkg/compress/gzip/gunzip_test.go
@@ -282,7 +282,7 @@
 
 func TestInflater(t *testing.T) {
 	b := new(bytes.Buffer);
-	for i, tt := range gzipTests {
+	for _, tt := range gzipTests {
 		in := bytes.NewBuffer(tt.gzip);
 		gzip, err := NewInflater(in);
 		if err != nil {
diff --git a/src/pkg/compress/zlib/reader.go b/src/pkg/compress/zlib/reader.go
index 6d4182d..d8c2e9b 100644
--- a/src/pkg/compress/zlib/reader.go
+++ b/src/pkg/compress/zlib/reader.go
@@ -39,7 +39,7 @@
 	} else {
 		z.r = bufio.NewReader(r);
 	}
-	n, err := io.ReadFull(z.r, z.scratch[0:2]);
+	_, err := io.ReadFull(z.r, z.scratch[0:2]);
 	if err != nil {
 		return nil, err;
 	}
diff --git a/src/pkg/compress/zlib/reader_test.go b/src/pkg/compress/zlib/reader_test.go
index 59aa0e7..9d250a1 100644
--- a/src/pkg/compress/zlib/reader_test.go
+++ b/src/pkg/compress/zlib/reader_test.go
@@ -77,7 +77,7 @@
 
 func TestInflater(t *testing.T) {
 	b := new(bytes.Buffer);
-	for i, tt := range zlibTests {
+	for _, tt := range zlibTests {
 		in := bytes.NewBuffer(tt.compressed);
 		zlib, err := NewInflater(in);
 		if err != nil {
diff --git a/src/pkg/container/vector/intvector.go b/src/pkg/container/vector/intvector.go
index 076f998..950926e 100644
--- a/src/pkg/container/vector/intvector.go
+++ b/src/pkg/container/vector/intvector.go
@@ -102,7 +102,7 @@
 
 // Iterate over all elements; driver for range
 func (p *IntVector) iterate(c chan<- int) {
-	for i, v := range p.a {
+	for _, v := range p.a {
 		c <- v.(int)
 	}
 	close(c);
diff --git a/src/pkg/container/vector/stringvector.go b/src/pkg/container/vector/stringvector.go
index 2ead95c..cda9760 100644
--- a/src/pkg/container/vector/stringvector.go
+++ b/src/pkg/container/vector/stringvector.go
@@ -101,7 +101,7 @@
 
 // Iterate over all elements; driver for range
 func (p *StringVector) iterate(c chan<- string) {
-	for i, v := range p.a {
+	for _, v := range p.a {
 		c <- v.(string)
 	}
 	close(c);
diff --git a/src/pkg/container/vector/vector.go b/src/pkg/container/vector/vector.go
index 483928c..179152c 100644
--- a/src/pkg/container/vector/vector.go
+++ b/src/pkg/container/vector/vector.go
@@ -230,7 +230,7 @@
 
 // Iterate over all elements; driver for range
 func (p *Vector) iterate(c chan<- Element) {
-	for i, v := range p.a {
+	for _, v := range p.a {
 		c <- v
 	}
 	close(c);
diff --git a/src/pkg/crypto/block/cbc_aes_test.go b/src/pkg/crypto/block/cbc_aes_test.go
index ec34ba1..8a84fea 100644
--- a/src/pkg/crypto/block/cbc_aes_test.go
+++ b/src/pkg/crypto/block/cbc_aes_test.go
@@ -67,7 +67,7 @@
 }
 
 func TestCBC_AES(t *testing.T) {
-	for i, tt := range cbcAESTests {
+	for _, tt := range cbcAESTests {
 		test := tt.name;
 
 		c, err := aes.NewCipher(tt.key);
diff --git a/src/pkg/crypto/block/cfb_aes_test.go b/src/pkg/crypto/block/cfb_aes_test.go
index 8c8565d..bf719ad 100644
--- a/src/pkg/crypto/block/cfb_aes_test.go
+++ b/src/pkg/crypto/block/cfb_aes_test.go
@@ -271,7 +271,7 @@
 }
 
 func TestCFB_AES(t *testing.T) {
-	for i, tt := range cfbAESTests {
+	for _, tt := range cfbAESTests {
 		test := tt.name;
 
 		if tt.s == 1 {
diff --git a/src/pkg/crypto/block/cmac.go b/src/pkg/crypto/block/cmac.go
index a556cf5..b567f0e 100644
--- a/src/pkg/crypto/block/cmac.go
+++ b/src/pkg/crypto/block/cmac.go
@@ -70,7 +70,7 @@
 // Write adds the given data to the digest state.
 func (d *cmac) Write(p []byte) (n int, err os.Error) {
 	// Xor input into ci.
-	for i, c := range p {
+	for _, c := range p {
 		// If ci is full, encrypt and start over.
 		if d.p >= len(d.ci) {
 			d.c.Encrypt(d.ci, d.ci);
diff --git a/src/pkg/crypto/block/ctr_aes_test.go b/src/pkg/crypto/block/ctr_aes_test.go
index 014e64d..97ae1eb 100644
--- a/src/pkg/crypto/block/ctr_aes_test.go
+++ b/src/pkg/crypto/block/ctr_aes_test.go
@@ -71,7 +71,7 @@
 }
 
 func TestCTR_AES(t *testing.T) {
-	for i, tt := range ctrAESTests {
+	for _, tt := range ctrAESTests {
 		test := tt.name;
 
 		c, err := aes.NewCipher(tt.key);
diff --git a/src/pkg/crypto/block/ecb.go b/src/pkg/crypto/block/ecb.go
index d250b18..e20c73a 100644
--- a/src/pkg/crypto/block/ecb.go
+++ b/src/pkg/crypto/block/ecb.go
@@ -127,7 +127,7 @@
 	if i < n {
 		p = p[i:n];
 		for j, v := range p {
-			x.buf[j] = p[j];
+			x.buf[j] = v;
 		}
 		x.crypt = x.buf[0:len(p)];
 		n = i;
diff --git a/src/pkg/crypto/block/ecb_aes_test.go b/src/pkg/crypto/block/ecb_aes_test.go
index 3453663..c9ce73f7 100644
--- a/src/pkg/crypto/block/ecb_aes_test.go
+++ b/src/pkg/crypto/block/ecb_aes_test.go
@@ -100,7 +100,7 @@
 }
 
 func TestECB_AES(t *testing.T) {
-	for i, tt := range ecbAESTests {
+	for _, tt := range ecbAESTests {
 		test := tt.name;
 
 		c, err := aes.NewCipher(tt.key);
diff --git a/src/pkg/crypto/block/ecb_test.go b/src/pkg/crypto/block/ecb_test.go
index 5cce446..5160e11 100644
--- a/src/pkg/crypto/block/ecb_test.go
+++ b/src/pkg/crypto/block/ecb_test.go
@@ -75,20 +75,20 @@
 			// copy plain into w in increasingly large chunks: 1, 1, 2, 4, 8, ...
 			// if frag != 0, move the 1 to the end to cause fragmentation.
 			if frag == 0 {
-				nn, err := io.Copyn(r, w, 1);
+				_, err := io.Copyn(r, w, 1);
 				if err != nil {
 					t.Errorf("block=%d frag=0: first Copyn: %s", block, err);
 					continue;
 				}
 			}
 			for n := 1; n <= len(plain)/2; n *= 2 {
-				nn, err := io.Copyn(r, w, int64(n));
+				_, err := io.Copyn(r, w, int64(n));
 				if err != nil {
 					t.Errorf("block=%d frag=%d: Copyn %d: %s", block, frag, n, err);
 				}
 			}
 			if frag != 0 {
-				nn, err := io.Copyn(r, w, 1);
+				_, err := io.Copyn(r, w, 1);
 				if err != nil {
 					t.Errorf("block=%d frag=1: last Copyn: %s", block, err);
 					continue;
@@ -140,20 +140,20 @@
 				// read from crypt in increasingly large chunks: 1, 1, 2, 4, 8, ...
 				// if frag == 1, move the 1 to the end to cause fragmentation.
 				if frag == 0 {
-					nn, err := io.Copyn(r, b, 1);
+					_, err := io.Copyn(r, b, 1);
 					if err != nil {
 						t.Errorf("%s: first Copyn: %s", test, err);
 						continue;
 					}
 				}
 				for n := 1; n <= maxio/2; n *= 2 {
-					nn, err := io.Copyn(r, b, int64(n));
+					_, err := io.Copyn(r, b, int64(n));
 					if err != nil {
 						t.Errorf("%s: Copyn %d: %s", test, n, err);
 					}
 				}
 				if frag != 0 {
-					nn, err := io.Copyn(r, b, 1);
+					_, err := io.Copyn(r, b, 1);
 					if err != nil {
 						t.Errorf("%s: last Copyn: %s", test, err);
 						continue;
diff --git a/src/pkg/crypto/block/ofb_aes_test.go b/src/pkg/crypto/block/ofb_aes_test.go
index 1937218..9b9f367 100644
--- a/src/pkg/crypto/block/ofb_aes_test.go
+++ b/src/pkg/crypto/block/ofb_aes_test.go
@@ -67,7 +67,7 @@
 }
 
 func TestOFB_AES(t *testing.T) {
-	for i, tt := range ofbAESTests {
+	for _, tt := range ofbAESTests {
 		test := tt.name;
 
 		c, err := aes.NewCipher(tt.key);
diff --git a/src/pkg/crypto/block/xor_test.go b/src/pkg/crypto/block/xor_test.go
index 358c253..c2818f0 100644
--- a/src/pkg/crypto/block/xor_test.go
+++ b/src/pkg/crypto/block/xor_test.go
@@ -60,14 +60,14 @@
 			// copy plain into w in increasingly large chunks: 1, 1, 2, 4, 8, ...
 			// if frag != 0, move the 1 to the end to cause fragmentation.
 			if frag == 0 {
-				nn, err := io.Copyn(r, w, 1);
+				_, err := io.Copyn(r, w, 1);
 				if err != nil {
 					t.Errorf("%s: first Copyn: %s", test, err);
 					continue;
 				}
 			}
 			for n := 1; n <= len(plain)/2; n *= 2 {
-				nn, err := io.Copyn(r, w, int64(n));
+				_, err := io.Copyn(r, w, int64(n));
 				if err != nil {
 					t.Errorf("%s: Copyn %d: %s", test, n, err);
 				}
@@ -128,14 +128,14 @@
 				// read from crypt in increasingly large chunks: 1, 1, 2, 4, 8, ...
 				// if frag == 1, move the 1 to the end to cause fragmentation.
 				if frag == 0 {
-					nn, err := io.Copyn(r, b, 1);
+					_, err := io.Copyn(r, b, 1);
 					if err != nil {
 						t.Errorf("%s: first Copyn: %s", test, err);
 						continue;
 					}
 				}
 				for n := 1; n <= maxio/2; n *= 2 {
-					nn, err := io.Copyn(r, b, int64(n));
+					_, err := io.Copyn(r, b, int64(n));
 					if err != nil {
 						t.Errorf("%s: Copyn %d: %s", test, n, err);
 					}
diff --git a/src/pkg/datafmt/datafmt.go b/src/pkg/datafmt/datafmt.go
index d878a1b..c3ac311 100644
--- a/src/pkg/datafmt/datafmt.go
+++ b/src/pkg/datafmt/datafmt.go
@@ -728,7 +728,7 @@
 //
 func (f Format) Sprint(args ...) string {
 	var buf bytes.Buffer;
-	n, err := f.Fprint(&buf, nil, args);
+	_, err := f.Fprint(&buf, nil, args);
 	if err != nil {
 		fmt.Fprintf(&buf, "--- Sprint(%s) failed: %v", fmt.Sprint(args), err);
 	}
diff --git a/src/pkg/datafmt/parser.go b/src/pkg/datafmt/parser.go
index 245689a..d1fa3f2 100644
--- a/src/pkg/datafmt/parser.go
+++ b/src/pkg/datafmt/parser.go
@@ -368,7 +368,7 @@
 	// add custom formatters, if any
 	for name, form := range fmap {
 		name = remap(&p, name);
-		if t, found := p.rules[name]; !found {
+		if _, found := p.rules[name]; !found {
 			p.rules[name] = &custom{name, form};
 		} else {
 			var invalidPos token.Position;
diff --git a/src/pkg/debug/binary/binary.go b/src/pkg/debug/binary/binary.go
index 18c1d64..78e9baa 100644
--- a/src/pkg/debug/binary/binary.go
+++ b/src/pkg/debug/binary/binary.go
@@ -89,7 +89,7 @@
 		return os.NewError("binary.Read: invalid type " + v.Type().String());
 	}
 	d := &decoder{order: order, buf: make([]byte, size)};
-	if n, err := io.ReadFull(r, d.buf); err != nil {
+	if _, err := io.ReadFull(r, d.buf); err != nil {
 		return err;
 	}
 	d.value(v);
diff --git a/src/pkg/debug/gosym/pclntab.go b/src/pkg/debug/gosym/pclntab.go
index 9671d9a..b687ccc 100644
--- a/src/pkg/debug/gosym/pclntab.go
+++ b/src/pkg/debug/gosym/pclntab.go
@@ -63,12 +63,12 @@
 }
 
 func (t *LineTable) PCToLine(pc uint64) int {
-	b, pc, line := t.parse(pc, -1);
+	_, _, line := t.parse(pc, -1);
 	return line;
 }
 
 func (t *LineTable) LineToPC(line int, maxpc uint64) uint64 {
-	b, pc, line1 := t.parse(maxpc, line);
+	_, pc, line1 := t.parse(maxpc, line);
 	if line1 != line {
 		return 0;
 	}
diff --git a/src/pkg/ebnf/ebnf.go b/src/pkg/ebnf/ebnf.go
index 368a3c8..f71ccc7 100644
--- a/src/pkg/ebnf/ebnf.go
+++ b/src/pkg/ebnf/ebnf.go
@@ -123,7 +123,7 @@
 // Grammar verification
 
 func isLexical(name string) bool {
-	ch, len := utf8.DecodeRuneInString(name);
+	ch, _ := utf8.DecodeRuneInString(name);
 	return !unicode.IsUpper(ch);
 }
 
diff --git a/src/pkg/ebnf/parser.go b/src/pkg/ebnf/parser.go
index 03cc4a7..84afd38 100644
--- a/src/pkg/ebnf/parser.go
+++ b/src/pkg/ebnf/parser.go
@@ -195,7 +195,7 @@
 	for p.tok != token.EOF {
 		prod := p.parseProduction();
 		name := prod.Name.String;
-		if prev, found := grammar[name]; !found {
+		if _, found := grammar[name]; !found {
 			grammar[name] = prod;
 		} else {
 			p.Error(prod.Pos(), name + " declared already");
diff --git a/src/pkg/exec/exec.go b/src/pkg/exec/exec.go
index a50f9dc..a057bdc 100644
--- a/src/pkg/exec/exec.go
+++ b/src/pkg/exec/exec.go
@@ -158,9 +158,9 @@
 		// Loop on interrupt, but
 		// ignore other errors -- maybe
 		// caller has already waited for pid.
-		w, err := p.Wait(0);
+		_, err := p.Wait(0);
 		for err == os.EINTR {
-			w, err = p.Wait(0);
+			_, err = p.Wait(0);
 		}
 	}
 
@@ -209,7 +209,7 @@
 		return "", os.ENOENT;
 	}
 	pathenv := os.Getenv("PATH");
-	for i, dir := range strings.Split(pathenv, ":", 0) {
+	for _, dir := range strings.Split(pathenv, ":", 0) {
 		if dir == "" {
 			// Unix shell semantics: path element "" means "."
 			dir = ".";
diff --git a/src/pkg/flag/flag.go b/src/pkg/flag/flag.go
index b2509e6..f10edaa 100644
--- a/src/pkg/flag/flag.go
+++ b/src/pkg/flag/flag.go
@@ -203,14 +203,14 @@
 
 // VisitAll visits the flags, calling fn for each. It visits all flags, even those not set.
 func VisitAll(fn func(*Flag)) {
-	for k, f := range flags.formal {
+	for _, f := range flags.formal {
 		fn(f)
 	}
 }
 
 // Visit visits the flags, calling fn for each. It visits only those flags that have been set.
 func Visit(fn func(*Flag)) {
-	for k, f := range flags.actual {
+	for _, f := range flags.actual {
 		fn(f)
 	}
 }
@@ -243,7 +243,7 @@
 func PrintDefaults() {
 	VisitAll(func(f *Flag) {
 		format := "  -%s=%s: %s\n";
-		if s, ok := f.Value.(*stringValue); ok {
+		if _, ok := f.Value.(*stringValue); ok {
 			// put quotes on the value
 			format = "  -%s=%q: %s\n";
 		}
@@ -285,7 +285,7 @@
 func add(name string, value FlagValue, usage string) {
 	// Remember the default value as a string; it won't change.
 	f := &Flag{name, usage, value, value.String()};
-	dummy, alreadythere := flags.formal[name];
+	_, alreadythere := flags.formal[name];
 	if alreadythere {
 		fmt.Fprintln(os.Stderr, "flag redefined:", name);
 		panic("flag redefinition");	// Happens only if flags are declared with identical names
diff --git a/src/pkg/fmt/fmt_test.go b/src/pkg/fmt/fmt_test.go
index 20a2dff..b294ec4 100644
--- a/src/pkg/fmt/fmt_test.go
+++ b/src/pkg/fmt/fmt_test.go
@@ -194,7 +194,7 @@
 }
 
 func TestSprintf(t *testing.T) {
-	for i, tt := range fmttests {
+	for _, tt := range fmttests {
 		s := Sprintf(tt.fmt, tt.val);
 		if i := strings.Index(s, "0x"); i >= 0 && strings.Index(tt.out, "PTR") >= 0 {
 			j := i+2;
@@ -207,7 +207,7 @@
 			s = s[0:i] + "PTR" + s[j:len(s)];
 		}
 		if s != tt.out {
-			if ss, ok := tt.val.(string); ok {
+			if _, ok := tt.val.(string); ok {
 				// Don't requote the already-quoted strings.
 				// It's too confusing to read the errors.
 				t.Errorf("Sprintf(%q, %q) = %s want %s", tt.fmt, tt.val, s, tt.out);
@@ -258,7 +258,7 @@
 
 func TestFlagParser(t *testing.T) {
 	var flagprinter flagPrinter;
-	for i, tt := range flagtests {
+	for _, tt := range flagtests {
 		s := Sprintf(tt.in, &flagprinter);
 		if s != tt.out {
 			t.Errorf("Sprintf(%q, &flagprinter) => %q, want %q", tt.in, s, tt.out);
@@ -283,7 +283,7 @@
 		Test{ "%v", "{abc def 123}" },
 		Test{ "%+v", "{a:abc b:def c:123}" },
 	};
-	for i, tt := range tests {
+	for _, tt := range tests {
 		out := Sprintf(tt.fmt, s);
 		if out != tt.out {
 			t.Errorf("Sprintf(%q, &s) = %q, want %q", tt.fmt, out, tt.out);
diff --git a/src/pkg/fmt/print.go b/src/pkg/fmt/print.go
index 2c1b3ce..3c694f2 100644
--- a/src/pkg/fmt/print.go
+++ b/src/pkg/fmt/print.go
@@ -680,7 +680,7 @@
 
 		// int
 		case 'b':
-			if v, signed, ok := getInt(field); ok {
+			if v, _, ok := getInt(field); ok {
 				s = p.fmt.Fmt_b64(uint64(v)).Str()	// always unsigned
 			} else if v, ok := getFloat32(field); ok {
 				s = p.fmt.Fmt_fb32(v).Str()
@@ -690,7 +690,7 @@
 				goto badtype
 			}
 		case 'c':
-			if v, signed, ok := getInt(field); ok {
+			if v, _, ok := getInt(field); ok {
 				s = p.fmt.Fmt_c(int(v)).Str()
 			} else {
 				goto badtype
diff --git a/src/pkg/go/ast/ast.go b/src/pkg/go/ast/ast.go
index 3cddf4f..b0cb6bf 100644
--- a/src/pkg/go/ast/ast.go
+++ b/src/pkg/go/ast/ast.go
@@ -350,7 +350,7 @@
 // IsExported returns whether name is an exported Go symbol
 // (i.e., whether it begins with an uppercase letter).
 func IsExported(name string) bool {
-	ch, len := utf8.DecodeRuneInString(name);
+	ch, _ := utf8.DecodeRuneInString(name);
 	return unicode.IsUpper(ch);
 }
 
diff --git a/src/pkg/go/doc/comment.go b/src/pkg/go/doc/comment.go
index 0550e73..de127ff 100644
--- a/src/pkg/go/doc/comment.go
+++ b/src/pkg/go/doc/comment.go
@@ -43,13 +43,13 @@
 func commentText(comments []string) string {
 	once.Do(setupRegexps);
 	lines := make([]string, 0, 20);
-	for i, c := range comments {
+	for _, c := range comments {
 		// split on newlines
 		cl := strings.Split(c, "\n", 0);
 
 		// walk lines, stripping comment markers
 		w := 0;
-		for j, l := range cl {
+		for _, l := range cl {
 			// remove /* and */ lines
 			if comment_junk.MatchString(l) {
 				continue;
@@ -85,7 +85,7 @@
 		// add this comment to total list
 		// TODO: maybe separate with a single blank line
 		// if there is already a comment and len(cl) > 0?
-		for j, l := range cl {
+		for _, l := range cl {
 			n := len(lines);
 			if n+1 >= cap(lines) {
 				newlines := make([]string, n, 2*cap(lines));
@@ -205,7 +205,7 @@
 
 	// compute maximum common white prefix
 	prefix := block[0][0 : indentLen(block[0])];
-	for i, line := range block {
+	for _, line := range block {
 		if !isBlank(line) {
 			prefix = commonPrefix(prefix, line[0 : indentLen(line)]);
 		}
@@ -288,7 +288,7 @@
 			// they don't get the nice text formatting,
 			// just html escaping
 			w.Write(html_pre);
-			for k, line := range block {
+			for _, line := range block {
 				template.HtmlEscape(w, line);
 			}
 			w.Write(html_endpre);
diff --git a/src/pkg/go/doc/doc.go b/src/pkg/go/doc/doc.go
index 7f44eac..0fcb7d8 100644
--- a/src/pkg/go/doc/doc.go
+++ b/src/pkg/go/doc/doc.go
@@ -563,7 +563,7 @@
 func match(s string, a []string) bool {
 	for _, t := range a {
 		if isRegexp(t) {
-			if matched, err := regexp.MatchString(t, s); matched {
+			if matched, _ := regexp.MatchString(t, s); matched {
 				return true;
 			}
 		}
diff --git a/src/pkg/go/parser/interface.go b/src/pkg/go/parser/interface.go
index d840e9a..bc13e2e 100644
--- a/src/pkg/go/parser/interface.go
+++ b/src/pkg/go/parser/interface.go
@@ -38,7 +38,7 @@
 			}
 		case io.Reader:
 			var buf bytes.Buffer;
-			n, err := io.Copy(s, &buf);
+			_, err := io.Copy(s, &buf);
 			if err != nil {
 				return nil, err;
 			}
diff --git a/src/pkg/go/parser/parser.go b/src/pkg/go/parser/parser.go
index de44ed8..34d6146 100644
--- a/src/pkg/go/parser/parser.go
+++ b/src/pkg/go/parser/parser.go
@@ -650,7 +650,7 @@
 	var idents []*ast.Ident;
 	var typ ast.Expr;
 	x := p.parseQualifiedIdent();
-	if tmp, isIdent := x.(*ast.Ident); isIdent && (p.tok == token.COMMA || p.tok == token.LPAREN) {
+	if _, isIdent := x.(*ast.Ident); isIdent && (p.tok == token.COMMA || p.tok == token.LPAREN) {
 		// methods
 		idents = p.parseIdentList(x);
 		params, results := p.parseSignature();
diff --git a/src/pkg/go/parser/parser_test.go b/src/pkg/go/parser/parser_test.go
index 7a0b24d..03a92d1 100644
--- a/src/pkg/go/parser/parser_test.go
+++ b/src/pkg/go/parser/parser_test.go
@@ -21,7 +21,7 @@
 
 func TestParseIllegalInputs(t *testing.T) {
 	for _, src := range illegalInputs {
-		prog, err := ParseFile("", src, 0);
+		_, err := ParseFile("", src, 0);
 		if err == nil {
 			t.Errorf("ParseFile(%v) should have failed", src);
 		}
@@ -37,7 +37,7 @@
 
 func TestParseValidPrograms(t *testing.T) {
 	for _, src := range validPrograms {
-		prog, err := ParseFile("", src, 0);
+		_, err := ParseFile("", src, 0);
 		if err != nil {
 			t.Errorf("ParseFile(%q): %v", src, err);
 		}
@@ -53,7 +53,7 @@
 
 func TestParse3(t *testing.T) {
 	for _, filename := range validFiles {
-		prog, err := ParseFile(filename, nil, 0);
+		_, err := ParseFile(filename, nil, 0);
 		if err != nil {
 			t.Errorf("ParseFile(%s): %v", filename, err);
 		}
diff --git a/src/pkg/go/printer/printer.go b/src/pkg/go/printer/printer.go
index ac8cd88..84a0534 100644
--- a/src/pkg/go/printer/printer.go
+++ b/src/pkg/go/printer/printer.go
@@ -847,7 +847,7 @@
 func (p *printer) switchBlock(s *ast.BlockStmt) {
 	p.print(s.Pos(), token.LBRACE);
 	if len(s.List) > 0 {
-		for i, s := range s.List {
+		for _, s := range s.List {
 			// s is one of *ast.CaseClause, *ast.TypeCaseClause, *ast.CommClause;
 			p.print(newline);
 			p.stmt(s);
diff --git a/src/pkg/go/scanner/scanner_test.go b/src/pkg/go/scanner/scanner_test.go
index 52a483c..d243a84 100644
--- a/src/pkg/go/scanner/scanner_test.go
+++ b/src/pkg/go/scanner/scanner_test.go
@@ -282,7 +282,7 @@
 	var S Scanner;
 	S.Init("TestLineComments", strings.Bytes(src), nil, 0);
 	for _, s := range segments {
-		pos, tok, lit := S.Scan();
+		pos, _, lit := S.Scan();
 		checkPos(t, string(lit), pos, token.Position{s.filename, pos.Offset, s.line, pos.Column});
 	}
 
@@ -300,14 +300,14 @@
 	s.Init("", strings.Bytes("if true { }"), nil, 0);
 	s.Scan();  // if
 	s.Scan();  // true
-	pos, tok, lit := s.Scan();  // {
+	_, tok, _ := s.Scan();  // {
 	if tok != token.LBRACE {
 		t.Errorf("bad token: got %s, expected %s", tok.String(), token.LBRACE);
 	}
 
 	// 2nd init
 	s.Init("", strings.Bytes("go true { ]"), nil, 0);
-	pos, tok, lit = s.Scan();  // go
+	_, tok, _ = s.Scan();  // go
 	if tok != token.GO {
 		t.Errorf("bad token: got %s, expected %s", tok.String(), token.GO);
 	}
diff --git a/src/pkg/gob/codec_test.go b/src/pkg/gob/codec_test.go
index 9564d8c..8eff37e 100644
--- a/src/pkg/gob/codec_test.go
+++ b/src/pkg/gob/codec_test.go
@@ -42,7 +42,7 @@
 	b := new(bytes.Buffer);
 	encState := new(encoderState);
 	encState.b = b;
-	for i, tt := range encodeT {
+	for _, tt := range encodeT {
 		b.Reset();
 		encodeUint(encState, tt.x);
 		if encState.err != nil {
diff --git a/src/pkg/gob/decode.go b/src/pkg/gob/decode.go
index 2c17aee..9f964a3 100644
--- a/src/pkg/gob/decode.go
+++ b/src/pkg/gob/decode.go
@@ -45,7 +45,7 @@
 // decodeUintReader reads an encoded unsigned integer from an io.Reader.
 // Used only by the Decoder to read the message length.
 func decodeUintReader(r io.Reader, buf []byte) (x uint64, err os.Error) {
-	n1, err := r.Read(buf[0:1]);
+	_, err = r.Read(buf[0:1]);
 	if err != nil {
 		return
 	}
diff --git a/src/pkg/gob/decoder.go b/src/pkg/gob/decoder.go
index 3442f80..52a5015 100644
--- a/src/pkg/gob/decoder.go
+++ b/src/pkg/gob/decoder.go
@@ -37,7 +37,7 @@
 
 func (dec *Decoder) recvType(id typeId) {
 	// Have we already seen this type?  That's an error
-	if wt_, alreadySeen := dec.seen[id]; alreadySeen {
+	if _, alreadySeen := dec.seen[id]; alreadySeen {
 		dec.state.err = os.ErrorString("gob: duplicate type received");
 		return
 	}
@@ -54,8 +54,6 @@
 // The value underlying e must be the correct type for the next
 // data item received.
 func (dec *Decoder) Decode(e interface{}) os.Error {
-	rt, indir := indirect(reflect.Typeof(e));
-
 	// Make sure we're single-threaded through here.
 	dec.mutex.Lock();
 	defer dec.mutex.Unlock();
diff --git a/src/pkg/gob/encode.go b/src/pkg/gob/encode.go
index 34e5846..45247d5 100644
--- a/src/pkg/gob/encode.go
+++ b/src/pkg/gob/encode.go
@@ -372,7 +372,7 @@
 			};
 		case *reflect.StructType:
 			// Generate a closure that calls out to the engine for the nested type.
-			engine, err := getEncEngine(typ);
+			_, err := getEncEngine(typ);
 			if err != nil {
 				return nil, 0, err
 			}
diff --git a/src/pkg/gob/encoder.go b/src/pkg/gob/encoder.go
index a3c9685..bda4557 100644
--- a/src/pkg/gob/encoder.go
+++ b/src/pkg/gob/encoder.go
@@ -237,7 +237,7 @@
 
 func (enc *Encoder) sendType(origt reflect.Type) {
 	// Drill down to the base type.
-	rt, indir_ := indirect(origt);
+	rt, _ := indirect(origt);
 
 	// We only send structs - everything else is basic or an error
 	switch rt.(type) {
@@ -259,7 +259,7 @@
 	}
 
 	// Have we already sent this type?  This time we ask about the base type.
-	if id_, alreadySent := enc.sent[rt]; alreadySent {
+	if _, alreadySent := enc.sent[rt]; alreadySent {
 		return
 	}
 
@@ -296,7 +296,7 @@
 	if enc.state.b.Len() > 0 || enc.countState.b.Len() > 0 {
 		panicln("Encoder: buffer not empty")
 	}
-	rt, indir := indirect(reflect.Typeof(e));
+	rt, _ := indirect(reflect.Typeof(e));
 
 	// Make sure we're single-threaded through here.
 	enc.mutex.Lock();
@@ -304,7 +304,7 @@
 
 	// Make sure the type is known to the other side.
 	// First, have we already sent this type?
-	if id_, alreadySent := enc.sent[rt]; !alreadySent {
+	if _, alreadySent := enc.sent[rt]; !alreadySent {
 		// No, so send it.
 		enc.sendType(rt);
 		if enc.state.err != nil {
diff --git a/src/pkg/gob/type.go b/src/pkg/gob/type.go
index 8eb384a..21da877 100644
--- a/src/pkg/gob/type.go
+++ b/src/pkg/gob/type.go
@@ -292,7 +292,7 @@
 		field := make([]*fieldType, t.NumField());
 		for i := 0; i < t.NumField(); i++ {
 			f := t.Field(i);
-			typ, _indir := indirect(f.Type);
+			typ, _ := indirect(f.Type);
 			tname := typ.Name();
 			if tname == "" {
 				tname = f.Type.String();
@@ -384,7 +384,7 @@
 // The reflection type must have all its indirections processed out.
 // typeLock must be held.
 func getTypeInfo(rt reflect.Type) (*typeInfo, os.Error) {
-	if pt, ok := rt.(*reflect.PtrType); ok {
+	if _, ok := rt.(*reflect.PtrType); ok {
 		panicln("pointer type in getTypeInfo:", rt.String())
 	}
 	info, ok := typeInfoMap[rt];
diff --git a/src/pkg/http/client.go b/src/pkg/http/client.go
index 9c1951d..284106c 100644
--- a/src/pkg/http/client.go
+++ b/src/pkg/http/client.go
@@ -40,7 +40,7 @@
 // response headers with the given key, it returns the empty string and
 // false.  Keys are not case sensitive.
 func (r *Response) GetHeader(key string) (value string) {
-	value, present := r.Header[CanonicalHeaderKey(key)];
+	value, _ = r.Header[CanonicalHeaderKey(key)];
 	return;
 }
 
diff --git a/src/pkg/http/client_test.go b/src/pkg/http/client_test.go
index 69938f0..32f2c17 100644
--- a/src/pkg/http/client_test.go
+++ b/src/pkg/http/client_test.go
@@ -17,7 +17,7 @@
 	// TODO: add a proper test suite.  Current test merely verifies that
 	// we can retrieve the Google robots.txt file.
 
-	r, url, err := Get("http://www.google.com/robots.txt");
+	r, _, err := Get("http://www.google.com/robots.txt");
 	var b []byte;
 	if err == nil {
 		b, err = io.ReadAll(r.Body);
diff --git a/src/pkg/http/fs.go b/src/pkg/http/fs.go
index e8dda1d..b56a101 100644
--- a/src/pkg/http/fs.go
+++ b/src/pkg/http/fs.go
@@ -58,7 +58,7 @@
 		if err != nil || len(dirs) == 0 {
 			break
 		}
-		for i, d := range dirs {
+		for _, d := range dirs {
 			name := d.Name;
 			if d.IsDirectory() {
 				name += "/"
@@ -141,7 +141,7 @@
 	} else {
 		// read first chunk to decide between utf-8 text and binary
 		var buf [1024]byte;
-		n, err := io.ReadFull(f, &buf);
+		n, _ := io.ReadFull(f, &buf);
 		b := buf[0:n];
 		if isText(b) {
 			c.SetHeader("Content-Type", "text-plain; charset=utf-8");
diff --git a/src/pkg/http/request.go b/src/pkg/http/request.go
index 2467222..2b425b7 100644
--- a/src/pkg/http/request.go
+++ b/src/pkg/http/request.go
@@ -508,7 +508,7 @@
 	// like
 	//	Cache-Control: no-cache
 	if v, present := req.Header["Pragma"]; present && v == "no-cache" {
-		if cc, presentcc := req.Header["Cache-Control"]; !presentcc {
+		if _, presentcc := req.Header["Cache-Control"]; !presentcc {
 			req.Header["Cache-Control"] = "no-cache"
 		}
 	}
diff --git a/src/pkg/http/server.go b/src/pkg/http/server.go
index b7a8190..2944e50 100644
--- a/src/pkg/http/server.go
+++ b/src/pkg/http/server.go
@@ -367,7 +367,7 @@
 		// no leading http://server
 		if url == "" || url[0] != '/' {
 			// make relative path absolute
-			olddir, oldfile := path.Split(oldpath);
+			olddir, _ := path.Split(oldpath);
 			url = olddir + url;
 		}
 
diff --git a/src/pkg/http/url_test.go b/src/pkg/http/url_test.go
index 6a3cdb0..9e7ec94 100644
--- a/src/pkg/http/url_test.go
+++ b/src/pkg/http/url_test.go
@@ -190,7 +190,7 @@
 }
 
 func DoTest(t *testing.T, parse func(string) (*URL, os.Error), name string, tests []URLTest) {
-	for i, tt := range tests {
+	for _, tt := range tests {
 		u, err := parse(tt.in);
 		if err != nil {
 			t.Errorf("%s(%q) returned error %s", name, tt.in, err);
@@ -214,7 +214,7 @@
 }
 
 func DoTestString(t *testing.T, parse func(string) (*URL, os.Error), name string, tests []URLTest) {
-	for i, tt := range tests {
+	for _, tt := range tests {
 		u, err := parse(tt.in);
 		if err != nil {
 			t.Errorf("%s(%q) returned error %s", name, tt.in, err);
@@ -305,7 +305,7 @@
 }
 
 func TestURLUnescape(t *testing.T) {
-	for i, tt := range unescapeTests {
+	for _, tt := range unescapeTests {
 		actual, err := URLUnescape(tt.in);
 		if actual != tt.out || (err != nil) != (tt.err != nil) {
 			t.Errorf("URLUnescape(%q) = %q, %s; want %q, %s", tt.in, actual, err, tt.out, tt.err);
@@ -342,7 +342,7 @@
 }
 
 func TestURLEscape(t *testing.T) {
-	for i, tt := range escapeTests {
+	for _, tt := range escapeTests {
 		actual := URLEscape(tt.in);
 		if tt.out != actual {
 			t.Errorf("URLEscape(%q) = %q, want %q", tt.in, actual, tt.out);
diff --git a/src/pkg/image/image.go b/src/pkg/image/image.go
index 9062415..ce9eb02 100644
--- a/src/pkg/image/image.go
+++ b/src/pkg/image/image.go
@@ -185,7 +185,7 @@
 	// TODO(nigeltao): Revisit the "pick the palette color which minimizes sum-squared-difference"
 	// algorithm when the premultiplied vs unpremultiplied issue is resolved.
 	// Currently, we only compare the R, G and B values, and ignore A.
-	cr, cg, cb, ca := c.RGBA();
+	cr, cg, cb, _ := c.RGBA();
 	// Shift by 17 bits to avoid potential uint32 overflow in sum-squared-difference.
 	cr >>= 17;
 	cg >>= 17;
@@ -193,7 +193,7 @@
 	result := Color(nil);
 	bestSSD := uint32(1<<32 - 1);
 	for _, v := range p {
-		vr, vg, vb, va := v.RGBA();
+		vr, vg, vb, _ := v.RGBA();
 		vr >>= 17;
 		vg >>= 17;
 		vb >>= 17;
diff --git a/src/pkg/image/png/reader.go b/src/pkg/image/png/reader.go
index 2e67fd9..d715f0c 100644
--- a/src/pkg/image/png/reader.go
+++ b/src/pkg/image/png/reader.go
@@ -106,7 +106,7 @@
 	if length != 13 {
 		return FormatError("bad IHDR length");
 	}
-	n, err := io.ReadFull(r, d.scratch[0:13]);
+	_, err := io.ReadFull(r, d.scratch[0:13]);
 	if err != nil {
 		return err;
 	}
@@ -402,7 +402,7 @@
 }
 
 func (d *decoder) checkHeader(r io.Reader) os.Error {
-	n, err := io.ReadFull(r, d.scratch[0:8]);
+	_, err := io.ReadFull(r, d.scratch[0:8]);
 	if err != nil {
 		return err;
 	}
diff --git a/src/pkg/io/utils.go b/src/pkg/io/utils.go
index 45dd5f9..4230b03 100644
--- a/src/pkg/io/utils.go
+++ b/src/pkg/io/utils.go
@@ -14,7 +14,7 @@
 // ReadAll reads from r until an error or EOF and returns the data it read.
 func ReadAll(r Reader) ([]byte, os.Error) {
 	var buf bytes.Buffer;
-	n, err := Copy(r, &buf);
+	_, err := Copy(r, &buf);
 	return buf.Data(), err;
 }
 
diff --git a/src/pkg/log/log.go b/src/pkg/log/log.go
index c109efa..3d48285 100644
--- a/src/pkg/log/log.go
+++ b/src/pkg/log/log.go
@@ -97,7 +97,7 @@
 		}
 	}
 	if l.flag & (Lshortfile | Llongfile) != 0 {
-		pc, file, line, ok := runtime.Caller(calldepth);
+		_, file, line, ok := runtime.Caller(calldepth);
 		if ok {
 			if l.flag & Lshortfile != 0 {
 				short, ok := shortnames[file];
diff --git a/src/pkg/log/log_test.go b/src/pkg/log/log_test.go
index 52be680..a78aee6 100644
--- a/src/pkg/log/log_test.go
+++ b/src/pkg/log/log_test.go
@@ -75,7 +75,7 @@
 }
 
 func TestAllLog(t *testing.T) {
-	for i, testcase := range tests {
+	for _, testcase := range tests {
 		testLog(t, testcase.flag, testcase.prefix, testcase.pattern, false);
 		testLog(t, testcase.flag, testcase.prefix, testcase.pattern, true);
 	}
diff --git a/src/pkg/math/floor.go b/src/pkg/math/floor.go
index 1580221..7f2c911 100644
--- a/src/pkg/math/floor.go
+++ b/src/pkg/math/floor.go
@@ -14,7 +14,7 @@
 		}
 		return -d;
 	}
-	d, fract := Modf(x);
+	d, _ := Modf(x);
 	return d;
 }
 
diff --git a/src/pkg/math/sin.go b/src/pkg/math/sin.go
index 8f0959a..779a86e 100644
--- a/src/pkg/math/sin.go
+++ b/src/pkg/math/sin.go
@@ -29,7 +29,7 @@
 		var e float64;
 		e, y = Modf(x);
 		e = e + float64(quad);
-		temp1, f := Modf(0.25*e);
+		_, f := Modf(0.25*e);
 		quad = int(e - 4*f);
 	} else {
 		k := int32(x);
diff --git a/src/pkg/net/dnsconfig.go b/src/pkg/net/dnsconfig.go
index 5cbfbc4..063c8e9 100644
--- a/src/pkg/net/dnsconfig.go
+++ b/src/pkg/net/dnsconfig.go
@@ -79,19 +79,19 @@
 				s := f[i];
 				switch {
 				case len(s) >= 6 && s[0:6] == "ndots:":
-					n, i, ok := dtoi(s, 6);
+					n, _, _ := dtoi(s, 6);
 					if n < 1 {
 						n = 1
 					}
 					conf.ndots = n;
 				case len(s) >= 8 && s[0:8] == "timeout:":
-					n, i, ok := dtoi(s, 8);
+					n, _, _ := dtoi(s, 8);
 					if n < 1 {
 						n = 1
 					}
 					conf.timeout = n;
 				case len(s) >= 8 && s[0:9] == "attempts:":
-					n, i, ok := dtoi(s, 9);
+					n, _, _ := dtoi(s, 9);
 					if n < 1 {
 						n = 1
 					}
diff --git a/src/pkg/net/fd.go b/src/pkg/net/fd.go
index ec125f2..0f42239 100644
--- a/src/pkg/net/fd.go
+++ b/src/pkg/net/fd.go
@@ -244,8 +244,8 @@
 		}
 		if fd == s.pr.Fd() {
 			// Drain our wakeup pipe.
-			for nn, e := s.pr.Read(&scratch); nn > 0; {
-				nn, e = s.pr.Read(&scratch)
+			for nn, _ := s.pr.Read(&scratch); nn > 0; {
+				nn, _ = s.pr.Read(&scratch)
 			}
 
 			// Read from channels
@@ -327,7 +327,7 @@
 	if e != 0 {
 		return "";
 	}
-	addr, err := sockaddrToString(sa);
+	addr, _ := sockaddrToString(sa);
 	return addr;
 }
 
@@ -336,7 +336,7 @@
 	if e != 0 {
 		return "";
 	}
-	addr, err := sockaddrToString(sa);
+	addr, _ := sockaddrToString(sa);
 	return addr;
 }
 
diff --git a/src/pkg/net/net.go b/src/pkg/net/net.go
index c2c835a..5fb49d4 100644
--- a/src/pkg/net/net.go
+++ b/src/pkg/net/net.go
@@ -220,7 +220,7 @@
 	}
 	if addr == nil {
 		// Not an IP address.  Try as a DNS name.
-		hostname, addrs, err1 := LookupHost(host);
+		_, addrs, err1 := LookupHost(host);
 		if err1 != nil {
 			err = err1;
 			goto Error;
diff --git a/src/pkg/net/net_test.go b/src/pkg/net/net_test.go
index 3430efb..15ab2d5 100644
--- a/src/pkg/net/net_test.go
+++ b/src/pkg/net/net_test.go
@@ -63,7 +63,7 @@
 			continue;
 		}
 		s := e.String();
-		match, err := regexp.MatchString(tt.Pattern, s);
+		match, _ := regexp.MatchString(tt.Pattern, s);
 		if !match {
 			t.Errorf("#%d: %q, want match for %#q", i, s, tt.Pattern);
 		}
diff --git a/src/pkg/net/parse.go b/src/pkg/net/parse.go
index 8b10519..ef5f115 100644
--- a/src/pkg/net/parse.go
+++ b/src/pkg/net/parse.go
@@ -46,7 +46,7 @@
 	}
 	if len(f.data) < cap(f.data) {
 		ln := len(f.data);
-		n, err := io.ReadFull(f.file, f.data[ln:cap(f.data)]);
+		n, _ := io.ReadFull(f.file, f.data[ln:cap(f.data)]);
 		if n >= 0 {
 			f.data = f.data[0:ln+n];
 		}
diff --git a/src/pkg/net/server_test.go b/src/pkg/net/server_test.go
index c2be68a..76fc045 100644
--- a/src/pkg/net/server_test.go
+++ b/src/pkg/net/server_test.go
@@ -33,7 +33,7 @@
 	listening <- l.Addr();
 
 	for {
-		fd, addr, err := l.Accept();
+		fd, _, err := l.Accept();
 		if err != nil {
 			break;
 		}
diff --git a/src/pkg/os/env.go b/src/pkg/os/env.go
index b867cb5..04d7591 100644
--- a/src/pkg/os/env.go
+++ b/src/pkg/os/env.go
@@ -18,7 +18,7 @@
 
 func copyenv() {
 	env = make(map[string] string);
-	for i, s := range Envs {
+	for _, s := range Envs {
 		for j := 0; j < len(s); j++ {
 			if s[j] == '=' {
 				env[s[0:j]] = s[j+1:len(s)];
diff --git a/src/pkg/os/exec.go b/src/pkg/os/exec.go
index 3a30524..d183e0a 100644
--- a/src/pkg/os/exec.go
+++ b/src/pkg/os/exec.go
@@ -148,12 +148,12 @@
 
 // Getpid returns the process id of the caller.
 func Getpid() int {
-	p, r2, e := syscall.Syscall(syscall.SYS_GETPID, 0, 0, 0);
+	p, _, _ := syscall.Syscall(syscall.SYS_GETPID, 0, 0, 0);
 	return int(p)
 }
 
 // Getppid returns the process id of the caller's parent.
 func Getppid() int {
-	p, r2, e := syscall.Syscall(syscall.SYS_GETPPID, 0, 0, 0);
+	p, _, _ := syscall.Syscall(syscall.SYS_GETPPID, 0, 0, 0);
 	return int(p)
 }
diff --git a/src/pkg/os/getwd.go b/src/pkg/os/getwd.go
index 081f5e4..e23f74d 100644
--- a/src/pkg/os/getwd.go
+++ b/src/pkg/os/getwd.go
@@ -65,8 +65,8 @@
 				fd.Close();
 				return "", err;
 			}
-			for i, name := range names {
-				d, err := Lstat(parent + "/" + name);
+			for _, name := range names {
+				d, _ := Lstat(parent + "/" + name);
 				if d.Dev == dot.Dev && d.Ino == dot.Ino {
 					pwd = "/" + name + pwd;
 					goto Found;
diff --git a/src/pkg/os/os_test.go b/src/pkg/os/os_test.go
index 9f7df2a..c9131607 100644
--- a/src/pkg/os/os_test.go
+++ b/src/pkg/os/os_test.go
@@ -110,9 +110,9 @@
 	if err2 != nil {
 		t.Fatalf("readdirnames %q failed: %v", err2);
 	}
-	for i, m := range contents {
+	for _, m := range contents {
 		found := false;
-		for j, n := range s {
+		for _, n := range s {
 			if n == "." || n == ".." {
 				t.Errorf("got %s in directory", n);
 			}
@@ -139,9 +139,9 @@
 	if err2 != nil {
 		t.Fatalf("readdir %q failed: %v", dir, err2);
 	}
-	for i, m := range contents {
+	for _, m := range contents {
 		found := false;
-		for j, n := range s {
+		for _, n := range s {
 			if m == n.Name {
 				if found {
 					t.Error("present twice:", m);
@@ -412,7 +412,7 @@
 		t.Fatalf("getgroups: %s", err);
 	}
 	t.Log("groups: ", groups);
-	for i, g := range groups {
+	for _, g := range groups {
 		if err = Chown(Path, -1, g); err != nil {
 			t.Fatalf("chown %s -1 %d: %s", Path, g, err);
 		}
@@ -468,7 +468,7 @@
 	// (unlike, say, /var, /etc, and /tmp).
 	dirs := []string{ "/bin", "/", "/usr/bin" };
 	for mode := 0; mode < 2; mode++ {
-		for i, d := range dirs {
+		for _, d := range dirs {
 			if mode == 0 {
 				err = Chdir(d);
 			} else {
@@ -577,7 +577,7 @@
 }
 
 func TestOpenError(t *testing.T) {
-	for i, tt := range openErrorTests {
+	for _, tt := range openErrorTests {
 		f, err := Open(tt.path, tt.mode, 0);
 		if err == nil {
 			t.Errorf("Open(%q, %d) succeeded", tt.path, tt.mode);
diff --git a/src/pkg/os/path.go b/src/pkg/os/path.go
index a1718b5..ca157e5 100644
--- a/src/pkg/os/path.go
+++ b/src/pkg/os/path.go
@@ -90,7 +90,7 @@
 	err = nil;
 	for {
 		names, err1 := fd.Readdirnames(100);
-		for i, name := range names {
+		for _, name := range names {
 			err1 := RemoveAll(path + "/" + name);
 			if err == nil {
 				err = err1;
diff --git a/src/pkg/os/path_test.go b/src/pkg/os/path_test.go
index 2790d98..d7f5957 100644
--- a/src/pkg/os/path_test.go
+++ b/src/pkg/os/path_test.go
@@ -26,7 +26,7 @@
 
 	// Make file.
 	fpath := path + "/file";
-	fd, err := Open(fpath, O_WRONLY | O_CREAT, 0666);
+	_, err = Open(fpath, O_WRONLY | O_CREAT, 0666);
 	if err != nil {
 		t.Fatalf("create %q: %s", fpath, err);
 	}
@@ -79,7 +79,7 @@
 	if err = RemoveAll(path); err != nil {
 		t.Fatalf("RemoveAll %q (first): %s", path, err);
 	}
-	if dir, err := Lstat(path); err == nil {
+	if _, err := Lstat(path); err == nil {
 		t.Fatalf("Lstat %q succeeded after RemoveAll (first)", path);
 	}
 
@@ -100,7 +100,7 @@
 	if err = RemoveAll(path); err != nil {
 		t.Fatalf("RemoveAll %q (second): %s", path, err);
 	}
-	if dir, err := Lstat(path); err == nil {
+	if _, err := Lstat(path); err == nil {
 		t.Fatalf("Lstat %q succeeded after RemoveAll (second)", path);
 	}
 
@@ -109,7 +109,7 @@
 		t.Fatalf("MkdirAll %q: %s", dpath, err);
 	}
 
-	for i, s := range []string{fpath, dpath+"/file1", path+"/zzz"} {
+	for _, s := range []string{fpath, dpath+"/file1", path+"/zzz"} {
 		fd, err = Open(s, O_WRONLY | O_CREAT, 0666);
 		if err != nil {
 			t.Fatalf("create %q: %s", s, err);
@@ -120,7 +120,7 @@
 		t.Fatalf("Chmod %q 0: %s", dpath, err);
 	}
 	if err = RemoveAll(path); err == nil {
-		dir, err := Lstat(path);
+		_, err := Lstat(path);
 		if err == nil {
 			t.Errorf("Can lstat %q after supposed RemoveAll", path);
 		}
@@ -136,15 +136,15 @@
 	if err = Chmod(dpath, 0777); err != nil {
 		t.Fatalf("Chmod %q 0777: %s", dpath, err);
 	}
-	for i, s := range []string{fpath, path+"/zzz"} {
-		if dir, err := Lstat(s); err == nil {
+	for _, s := range []string{fpath, path+"/zzz"} {
+		if _, err := Lstat(s); err == nil {
 			t.Fatalf("Lstat %q succeeded after partial RemoveAll", s);
 		}
 	}
 	if err = RemoveAll(path); err != nil {
 		t.Fatalf("RemoveAll %q after partial RemoveAll: %s", path, err);
 	}
-	if dir, err := Lstat(path); err == nil {
+	if _, err := Lstat(path); err == nil {
 		t.Fatalf("Lstat %q succeeded after RemoveAll (final)", path);
 	}
 }
diff --git a/src/pkg/path/path_test.go b/src/pkg/path/path_test.go
index 386c17c..22e0b4d 100644
--- a/src/pkg/path/path_test.go
+++ b/src/pkg/path/path_test.go
@@ -63,7 +63,7 @@
 }
 
 func TestClean(t *testing.T) {
-	for i, test := range cleantests {
+	for _, test := range cleantests {
 		if s := Clean(test.path); s != test.clean {
 			t.Errorf("Clean(%q) = %q, want %q", test.path, s, test.clean);
 		}
@@ -83,7 +83,7 @@
 }
 
 func TestSplit(t *testing.T) {
-	for i, test := range splittests {
+	for _, test := range splittests {
 		if d, f := Split(test.path); d != test.dir || f != test.file {
 			t.Errorf("Split(%q) = %q, %q, want %q, %q", test.path, d, f, test.dir, test.file);
 		}
@@ -105,7 +105,7 @@
 }
 
 func TestJoin(t *testing.T) {
-	for i, test := range jointests {
+	for _, test := range jointests {
 		if p := Join(test.dir, test.file); p != test.path {
 			t.Errorf("Join(%q, %q) = %q, want %q", test.dir, test.file, p, test.path);
 		}
@@ -125,7 +125,7 @@
 }
 
 func TestExt(t *testing.T) {
-	for i, test := range exttests {
+	for _, test := range exttests {
 		if x := Ext(test.path); x != test.ext {
 			t.Errorf("Ext(%q) = %q, want %q", test.path, x, test.ext);
 		}
diff --git a/src/pkg/reflect/all_test.go b/src/pkg/reflect/all_test.go
index 0702513..17a526c 100644
--- a/src/pkg/reflect/all_test.go
+++ b/src/pkg/reflect/all_test.go
@@ -266,7 +266,7 @@
 	assert(t, v3.Type().String(), "float");
 
 	i3 := v2.Interface();
-	if f, ok := i3.(float); !ok {
+	if _, ok := i3.(float); !ok {
 		t.Error("v2.Interface() did not return float, got ", Typeof(i3));
 	}
 }
@@ -392,7 +392,7 @@
 }
 
 func TestDeepEqual(t *testing.T) {
-	for i, test := range deepEqualTests {
+	for _, test := range deepEqualTests {
 		if r := DeepEqual(test.a, test.b); r != test.eq {
 			t.Errorf("DeepEqual(%v, %v) = %v, want %v", test.a, test.b, r, test.eq);
 		}
@@ -400,7 +400,7 @@
 }
 
 func TestTypeof(t *testing.T) {
-	for i, test := range deepEqualTests {
+	for _, test := range deepEqualTests {
 		v := NewValue(test.a);
 		if v == nil {
 			continue;
@@ -510,10 +510,10 @@
 func TestIsNil(t *testing.T) {
 	// These do not implement IsNil
 	doNotNil := []interface{}{ int(0), float32(0), struct{a int}{} };
-	for i, ts := range doNotNil {
+	for _, ts := range doNotNil {
 		ty := Typeof(ts);
 		v := MakeZero(ty);
-		if nilable, ok := v.(IsNiller); ok {
+		if _, ok := v.(IsNiller); ok {
 			t.Errorf("%s is nilable; should not be", ts)
 		}
 	}
@@ -528,10 +528,10 @@
 		struct{x chan int}{},
 		struct{x []string}{}
 	};
-	for i, ts := range doNil {
+	for _, ts := range doNil {
 		ty := Typeof(ts).(*StructType).Field(0).Type;
 		v := MakeZero(ty);
-		if nilable, ok := v.(IsNiller); !ok {
+		if _, ok := v.(IsNiller); !ok {
 			t.Errorf("%s %T is not nilable; should be", ts, v)
 		}
 	}
diff --git a/src/pkg/reflect/deepequal.go b/src/pkg/reflect/deepequal.go
index 60539bf..3c5663a 100644
--- a/src/pkg/reflect/deepequal.go
+++ b/src/pkg/reflect/deepequal.go
@@ -45,7 +45,7 @@
 
 	// ... or already seen
 	h := 17 * addr1 + addr2;
-	seen, ok := visited[h];
+	seen, _ := visited[h];
 	typ := v1.Type();
 	for p := seen; p != nil; p = p.next {
 		if p.a1 == addr1 && p.a2 == addr2 && p.typ == typ {
@@ -105,7 +105,7 @@
 		if map1.Len() != map2.Len() {
 			return false;
 		}
-		for i, k := range map1.Keys() {
+		for _, k := range map1.Keys() {
 			if !deepValueEqual(map1.Elem(k), map2.Elem(k), visited, depth+1) {
 				return false;
 			}
diff --git a/src/pkg/reflect/value.go b/src/pkg/reflect/value.go
index 727a9c1..33113d0 100644
--- a/src/pkg/reflect/value.go
+++ b/src/pkg/reflect/value.go
@@ -1195,7 +1195,7 @@
 func newValue(typ Type, addr addr, canSet bool) Value {
 	// FuncValue has a different layout;
 	// it needs a extra space for the fixed receivers.
-	if t, ok := typ.(*FuncType); ok {
+	if _, ok := typ.(*FuncType); ok {
 		return newFuncValue(typ, addr, canSet);
 	}
 
diff --git a/src/pkg/regexp/all_test.go b/src/pkg/regexp/all_test.go
index e6e3eb2..f1bea01 100644
--- a/src/pkg/regexp/all_test.go
+++ b/src/pkg/regexp/all_test.go
@@ -348,7 +348,7 @@
 }
 
 func TestReplaceAll(t *testing.T) {
-	for i, tc := range replaceTests {
+	for _, tc := range replaceTests {
 		re, err := Compile(tc.pattern);
 		if err != nil {
 			t.Errorf("Unexpected error compiling %q: %v", tc.pattern, err);
@@ -379,7 +379,7 @@
 }
 
 func TestQuoteMeta(t *testing.T) {
-	for i, tc := range quoteMetaTests {
+	for _, tc := range quoteMetaTests {
 		// Verify that QuoteMeta returns the expected string.
 		quoted := QuoteMeta(tc.pattern);
 		if quoted != tc.output {
@@ -449,7 +449,7 @@
 func TestAllMatches(t *testing.T) {
 	ch := make(chan matchCase);
 	go func() {
-		for i, c := range matchCases {
+		for _, c := range matchCases {
 			ch <- c;
 			stringCase := matchCase{
 				"string" + c.matchfunc,
@@ -464,7 +464,7 @@
 
 	for c := range ch {
 		var result []string;
-		re, err := Compile(c.regexp);
+		re, _ := Compile(c.regexp);
 
 		switch c.matchfunc {
 		case "matchit":
@@ -488,7 +488,7 @@
 			result = make([]string, len(c.input) + 1);
 			b := strings.Bytes(c.input);
 			i := 0;
-			for j, match := range re.AllMatches(b, c.n) {
+			for _, match := range re.AllMatches(b, c.n) {
 				result[i] = string(match);
 				i++;
 			}
diff --git a/src/pkg/regexp/regexp.go b/src/pkg/regexp/regexp.go
index b378a66..b1baf67 100644
--- a/src/pkg/regexp/regexp.go
+++ b/src/pkg/regexp/regexp.go
@@ -868,7 +868,7 @@
 		lastMatchEnd = a[1];
 
 		// Advance past this match; always advance at least one character.
-		rune, width := utf8.DecodeRuneInString(src[searchPos:len(src)]);
+		_, width := utf8.DecodeRuneInString(src[searchPos:len(src)]);
 		if searchPos + width > a[1] {
 			searchPos += width;
 		} else if searchPos + 1 > a[1] {
@@ -912,7 +912,7 @@
 		lastMatchEnd = a[1];
 
 		// Advance past this match; always advance at least one character.
-		rune, width := utf8.DecodeRune(src[searchPos:len(src)]);
+		_, width := utf8.DecodeRune(src[searchPos:len(src)]);
 		if searchPos + width > a[1] {
 			searchPos += width;
 		} else if searchPos + 1 > a[1] {
diff --git a/src/pkg/rpc/client.go b/src/pkg/rpc/client.go
index 8663ad4..4c6dd89 100644
--- a/src/pkg/rpc/client.go
+++ b/src/pkg/rpc/client.go
@@ -92,7 +92,7 @@
 	// Terminate pending calls.
 	client.mutex.Lock();
 	client.shutdown = err;
-	for seq, call := range client.pending {
+	for _, call := range client.pending {
 		call.Error = err;
 		_ = call.Done <- call;	// do not block
 	}
diff --git a/src/pkg/rpc/server.go b/src/pkg/rpc/server.go
index c7335a6..e895162 100644
--- a/src/pkg/rpc/server.go
+++ b/src/pkg/rpc/server.go
@@ -170,7 +170,7 @@
 
 // Is this a publicly vislble - upper case - name?
 func isPublic(name string) bool {
-	rune, wid_ := utf8.DecodeRuneInString(name);
+	rune, _ := utf8.DecodeRuneInString(name);
 	return unicode.IsUpper(rune)
 }
 
@@ -354,7 +354,7 @@
 
 func (server *serverType) accept(lis net.Listener) {
 	for {
-		conn, addr, err := lis.Accept();
+		conn, _, err := lis.Accept();
 		if err != nil {
 			log.Exit("rpc.Serve: accept:", err.String());	// TODO(r): exit?
 		}
@@ -399,7 +399,7 @@
 		io.WriteString(c, "405 must CONNECT to " + rpcPath + "\n");
 		return;
 	}
-	conn, buf, err := c.Hijack();
+	conn, _, err := c.Hijack();
 	if err != nil {
 		log.Stderr("rpc hijacking ", c.RemoteAddr, ": ", err.String());
 		return;
diff --git a/src/pkg/strconv/itoa_test.go b/src/pkg/strconv/itoa_test.go
index 793ece6..554c10b 100644
--- a/src/pkg/strconv/itoa_test.go
+++ b/src/pkg/strconv/itoa_test.go
@@ -60,7 +60,7 @@
 }
 
 func TestItoa(t *testing.T) {
-	for i, test := range itob64tests {
+	for _, test := range itob64tests {
 		s := Itob64(test.in, test.base);
 		if s != test.out {
 			t.Errorf("Itob64(%v, %v) = %v want %v\n",
@@ -140,7 +140,7 @@
 }
 
 func TestUitoa(t *testing.T) {
-	for i, test := range uitob64tests {
+	for _, test := range uitob64tests {
 		s := Uitob64(test.in, test.base);
 		if s != test.out {
 			t.Errorf("Uitob64(%v, %v) = %v want %v\n",
diff --git a/src/pkg/strings/strings.go b/src/pkg/strings/strings.go
index f0f0761..4883d39 100644
--- a/src/pkg/strings/strings.go
+++ b/src/pkg/strings/strings.go
@@ -157,7 +157,7 @@
 	maxbytes := len(s);	// length of b
 	nbytes := 0;	// number of bytes encoded in b
 	b := make([]byte, maxbytes);
-	for i, c := range s {
+	for _, c := range s {
 		rune := mapping(c);
 		wid := 1;
 		if rune >= utf8.RuneSelf {
@@ -196,8 +196,8 @@
 // removed, as defined by Unicode.
 func TrimSpace(s string) string {
 	start, end := 0, len(s);
-	for wid := 0; start < end; start += wid {
-		wid = 1;
+	for start < end {
+		wid := 1;
 		rune := int(s[start]);
 		if rune >= utf8.RuneSelf {
 			rune, wid = utf8.DecodeRuneInString(s[start:end])
@@ -205,9 +205,10 @@
 		if !unicode.IsSpace(rune) {
 			break;
 		}
+		start += wid;
 	}
-	for wid := 0; start < end; end -= wid {
-		wid = 1;
+	for start < end {
+		wid := 1;
 		rune := int(s[end-1]);
 		if rune >= utf8.RuneSelf {
 			// Back up carefully looking for beginning of rune. Mustn't pass start.
@@ -221,6 +222,7 @@
 		if !unicode.IsSpace(rune) {
 			break;
 		}
+		end -= wid;
 	}
 	return s[start:end];
 }
diff --git a/src/pkg/strings/strings_test.go b/src/pkg/strings/strings_test.go
index 7925ae8..a01285e 100644
--- a/src/pkg/strings/strings_test.go
+++ b/src/pkg/strings/strings_test.go
@@ -66,7 +66,7 @@
 // Execute f on each test case.  funcName should be the name of f; it's used
 // in failure reports.
 func runIndexTests(t *testing.T, f func(s, sep string) int, funcName string, testCases []IndexTest) {
-	for i,test := range testCases {
+	for _, test := range testCases {
 		actual := f(test.s, test.sep);
 		if actual != test.out {
 			t.Errorf("%s(%q,%q) = %v; want %v", funcName, test.s, test.sep, actual, test.out);
@@ -149,7 +149,7 @@
 // Execute f on each test case.  funcName should be the name of f; it's used
 // in failure reports.
 func runStringTests(t *testing.T, f func(string) string, funcName string, testCases []StringTest) {
-	for i, tc := range testCases {
+	for _, tc := range testCases {
 		actual := f(tc.in);
 		if actual != tc.out {
 			t.Errorf("%s(%q) = %q; want %q", funcName, tc.in, actual, tc.out);
@@ -237,8 +237,8 @@
 		if i > len(e2) {
 			break
 		}
-		r1, w := utf8.DecodeRuneInString(c1);
-		r2, w := utf8.DecodeRuneInString(e2[i]);
+		r1, _ := utf8.DecodeRuneInString(c1);
+		r2, _ := utf8.DecodeRuneInString(e2[i]);
 		if r1 != r2 {
 			t.Errorf("%s diff at %d: U+%04X U+%04X", m, i, r1, r2)
 		}
diff --git a/src/pkg/syscall/exec.go b/src/pkg/syscall/exec.go
index 1ba2f93..9aeeda1 100644
--- a/src/pkg/syscall/exec.go
+++ b/src/pkg/syscall/exec.go
@@ -85,7 +85,7 @@
 	} else {
 		flag &= ^O_NONBLOCK;
 	}
-	flag, err = fcntl(fd, F_SETFL, flag);
+	_, err = fcntl(fd, F_SETFL, flag);
 	return err;
 }
 
@@ -133,7 +133,7 @@
 
 	// Enable tracing if requested.
 	if traceme {
-		r1, r2, err1 = RawSyscall(SYS_PTRACE, uintptr(_PTRACE_TRACEME), 0, 0);
+		_, _, err1 = RawSyscall(SYS_PTRACE, uintptr(_PTRACE_TRACEME), 0, 0);
 		if err1 != 0 {
 			goto childerror;
 		}
@@ -141,7 +141,7 @@
 
 	// Chdir
 	if dir != nil {
-		r1, r2, err1 = RawSyscall(SYS_CHDIR, uintptr(unsafe.Pointer(dir)), 0, 0);
+		_, _, err1 = RawSyscall(SYS_CHDIR, uintptr(unsafe.Pointer(dir)), 0, 0);
 		if err1 != 0 {
 			goto childerror;
 		}
@@ -151,7 +151,7 @@
 	// so that pass 2 won't stomp on an fd it needs later.
 	nextfd = int(len(fd));
 	if pipe < nextfd {
-		r1, r2, err1 = RawSyscall(SYS_DUP2, uintptr(pipe), uintptr(nextfd), 0);
+		_, _, err1 = RawSyscall(SYS_DUP2, uintptr(pipe), uintptr(nextfd), 0);
 		if err1 != 0 {
 			goto childerror;
 		}
@@ -161,7 +161,7 @@
 	}
 	for i = 0; i < len(fd); i++ {
 		if fd[i] >= 0 && fd[i] < int(i) {
-			r1, r2, err1 = RawSyscall(SYS_DUP2, uintptr(fd[i]), uintptr(nextfd), 0);
+			_, _, err1 = RawSyscall(SYS_DUP2, uintptr(fd[i]), uintptr(nextfd), 0);
 			if err1 != 0 {
 				goto childerror;
 			}
@@ -183,7 +183,7 @@
 		if fd[i] == int(i) {
 			// dup2(i, i) won't clear close-on-exec flag on Linux,
 			// probably not elsewhere either.
-			r1, r2, err1 = RawSyscall(SYS_FCNTL, uintptr(fd[i]), F_SETFD, 0);
+			_, _, err1 = RawSyscall(SYS_FCNTL, uintptr(fd[i]), F_SETFD, 0);
 			if err1 != 0 {
 				goto childerror;
 			}
@@ -191,7 +191,7 @@
 		}
 		// The new fd is created NOT close-on-exec,
 		// which is exactly what we want.
-		r1, r2, err1 = RawSyscall(SYS_DUP2, uintptr(fd[i]), uintptr(i), 0);
+		_, _, err1 = RawSyscall(SYS_DUP2, uintptr(fd[i]), uintptr(i), 0);
 		if err1 != 0 {
 			goto childerror;
 		}
@@ -206,7 +206,7 @@
 	}
 
 	// Time to exec.
-	r1, r2, err1 = RawSyscall(SYS_EXECVE,
+	_, _, err1 = RawSyscall(SYS_EXECVE,
 		uintptr(unsafe.Pointer(argv0)),
 		uintptr(unsafe.Pointer(&argv[0])),
 		uintptr(unsafe.Pointer(&envv[0])));
@@ -287,9 +287,9 @@
 
 		// Child failed; wait for it to exit, to make sure
 		// the zombies don't accumulate.
-		pid1, err1 := Wait4(pid, &wstatus, 0, nil);
+		_, err1 := Wait4(pid, &wstatus, 0, nil);
 		for err1 == EINTR {
-			pid1, err1 = Wait4(pid, &wstatus, 0, nil);
+			_, err1 = Wait4(pid, &wstatus, 0, nil);
 		}
 		return 0, err
 	}
@@ -314,7 +314,7 @@
 
 // Ordinary exec.
 func Exec(argv0 string, argv []string, envv []string) (err int) {
-	r1, r2, err1 := RawSyscall(SYS_EXECVE,
+	_, _, err1 := RawSyscall(SYS_EXECVE,
 		uintptr(unsafe.Pointer(StringBytePtr(argv0))),
 		uintptr(unsafe.Pointer(&StringArrayPtr(argv)[0])),
 		uintptr(unsafe.Pointer(&StringArrayPtr(envv)[0])));
diff --git a/src/pkg/template/template_test.go b/src/pkg/template/template_test.go
index 95356b2..b96a682 100644
--- a/src/pkg/template/template_test.go
+++ b/src/pkg/template/template_test.go
@@ -297,7 +297,7 @@
 	s.false = false;
 
 	var buf bytes.Buffer;
-	for i, test := range tests {
+	for _, test := range tests {
 		buf.Reset();
 		tmpl, err := Parse(test.in, formatters);
 		if err != nil {
diff --git a/src/pkg/time/time.go b/src/pkg/time/time.go
index 7f5f53e..911fa82 100644
--- a/src/pkg/time/time.go
+++ b/src/pkg/time/time.go
@@ -13,7 +13,7 @@
 // Seconds reports the number of seconds since the Unix epoch,
 // January 1, 1970 00:00:00 UTC.
 func Seconds() int64 {
-	sec, nsec, err := os.Time();
+	sec, _, err := os.Time();
 	if err != nil {
 		panic("time: os.Time: ", err.String());
 	}
diff --git a/src/pkg/time/zoneinfo.go b/src/pkg/time/zoneinfo.go
index cd2cef4..215c95b 100644
--- a/src/pkg/time/zoneinfo.go
+++ b/src/pkg/time/zoneinfo.go
@@ -132,7 +132,7 @@
 	abbrev := d.read(n[NChar]);
 
 	// Leap-second time pairs
-	leapdata := data{d.read(n[NLeap]*8), false};
+	d.read(n[NLeap]*8);
 
 	// Whether tx times associated with local time types
 	// are specified as standard time or wall time.
diff --git a/src/pkg/unicode/digit_test.go b/src/pkg/unicode/digit_test.go
index a95051f..0d5582f 100644
--- a/src/pkg/unicode/digit_test.go
+++ b/src/pkg/unicode/digit_test.go
@@ -104,12 +104,12 @@
 }
 
 func TestDigit(t *testing.T) {
-	for i, r := range testDigit {
+	for _, r := range testDigit {
 		if !IsDigit(r) {
 			t.Errorf("IsDigit(U+%04X) = false, want true\n", r);
 		}
 	}
-	for i, r := range testLetter {
+	for _, r := range testLetter {
 		if IsDigit(r) {
 			t.Errorf("IsDigit(U+%04X) = true, want false\n", r);
 		}
diff --git a/src/pkg/unicode/letter.go b/src/pkg/unicode/letter.go
index 45b68f4..2c350a1 100644
--- a/src/pkg/unicode/letter.go
+++ b/src/pkg/unicode/letter.go
@@ -54,7 +54,7 @@
 func Is(ranges []Range, rune int) bool {
 	// common case: rune is ASCII or Latin-1
 	if rune < 0x100 {
-		for i, r := range ranges {
+		for _, r := range ranges {
 			if rune > r.Hi {
 				continue;
 			}
@@ -150,7 +150,7 @@
 				// The characters at even offsets from the beginning of the
 				// sequence are upper case; the ones at odd offsets are lower.
 				// The correct mapping can be done by clearing or setting the low
-				// bit in the sequence offset. 
+				// bit in the sequence offset.
 				// The constants UpperCase and TitleCase are even while LowerCase
 				// is odd so we take the low bit from _case.
 				return r.Lo + ((rune - r.Lo)&^1 | _case&1);
diff --git a/src/pkg/unicode/letter_test.go b/src/pkg/unicode/letter_test.go
index b623354..3920e18 100644
--- a/src/pkg/unicode/letter_test.go
+++ b/src/pkg/unicode/letter_test.go
@@ -214,17 +214,17 @@
 }
 
 func TestIsLetter(t *testing.T) {
-	for i, r := range upperTest {
+	for _, r := range upperTest {
 		if !IsLetter(r) {
 			t.Errorf("IsLetter(U+%04X) = false, want true\n", r);
 		}
 	}
-	for i, r := range letterTest {
+	for _, r := range letterTest {
 		if !IsLetter(r) {
 			t.Errorf("IsLetter(U+%04X) = false, want true\n", r);
 		}
 	}
-	for i, r := range notletterTest {
+	for _, r := range notletterTest {
 		if IsLetter(r) {
 			t.Errorf("IsLetter(U+%04X) = true, want false\n", r);
 		}
@@ -232,17 +232,17 @@
 }
 
 func TestIsUpper(t *testing.T) {
-	for i, r := range upperTest {
+	for _, r := range upperTest {
 		if !IsUpper(r) {
 			t.Errorf("IsUpper(U+%04X) = false, want true\n", r);
 		}
 	}
-	for i, r := range notupperTest {
+	for _, r := range notupperTest {
 		if IsUpper(r) {
 			t.Errorf("IsUpper(U+%04X) = true, want false\n", r);
 		}
 	}
-	for i, r := range notletterTest {
+	for _, r := range notletterTest {
 		if IsUpper(r) {
 			t.Errorf("IsUpper(U+%04X) = true, want false\n", r);
 		}
@@ -262,7 +262,7 @@
 }
 
 func TestTo(t *testing.T) {
-	for i, c := range caseTest {
+	for _, c := range caseTest {
 		r := To(c.cas, c.in);
 		if c.out != r {
 			t.Errorf("To(U+%04X, %s) = U+%04X want U+%04X\n", c.in, caseString(c.cas), r, c.out);
@@ -271,7 +271,7 @@
 }
 
 func TestToUpperCase(t *testing.T) {
-	for i, c := range caseTest {
+	for _, c := range caseTest {
 		if c.cas != UpperCase {
 			continue
 		}
@@ -283,7 +283,7 @@
 }
 
 func TestToLowerCase(t *testing.T) {
-	for i, c := range caseTest {
+	for _, c := range caseTest {
 		if c.cas != LowerCase {
 			continue
 		}
@@ -295,7 +295,7 @@
 }
 
 func TestToTitleCase(t *testing.T) {
-	for i, c := range caseTest {
+	for _, c := range caseTest {
 		if c.cas != TitleCase {
 			continue
 		}
diff --git a/src/pkg/unicode/script_test.go b/src/pkg/unicode/script_test.go
index 613b569..64e205c 100644
--- a/src/pkg/unicode/script_test.go
+++ b/src/pkg/unicode/script_test.go
@@ -174,7 +174,7 @@
 	for k := range Scripts {
 		notTested[k] = true
 	}
-	for i, test := range inTest {
+	for _, test := range inTest {
 		if _, ok := Scripts[test.script]; !ok {
 			t.Fatal(test.script, "not a known script")
 		}
@@ -183,7 +183,7 @@
 		}
 		notTested[test.script] = false, false
 	}
-	for i, test := range outTest {
+	for _, test := range outTest {
 		if Is(Scripts[test.script], test.rune) {
 			t.Errorf("IsScript(%#x, %s) = true, want false\n", test.rune, test.script);
 		}
@@ -198,7 +198,7 @@
 	for k := range Categories {
 		notTested[k] = true
 	}
-	for i, test := range inCategoryTest {
+	for _, test := range inCategoryTest {
 		if _, ok := Categories[test.script]; !ok {
 			t.Fatal(test.script, "not a known category")
 		}
@@ -217,7 +217,7 @@
 	for k := range Properties {
 		notTested[k] = true
 	}
-	for i, test := range inPropTest {
+	for _, test := range inPropTest {
 		if _, ok := Properties[test.script]; !ok {
 			t.Fatal(test.script, "not a known prop")
 		}
diff --git a/src/pkg/utf8/utf8.go b/src/pkg/utf8/utf8.go
index 735bd87..c8dc613 100644
--- a/src/pkg/utf8/utf8.go
+++ b/src/pkg/utf8/utf8.go
@@ -187,13 +187,13 @@
 // FullRune reports whether the bytes in p begin with a full UTF-8 encoding of a rune.
 // An invalid encoding is considered a full Rune since it will convert as a width-1 error rune.
 func FullRune(p []byte) bool {
-	rune, size, short := decodeRuneInternal(p);
+	_, _, short := decodeRuneInternal(p);
 	return !short
 }
 
 // FullRuneInString is like FullRune but its input is a string.
 func FullRuneInString(s string) bool {
-	rune, size, short := decodeRuneInStringInternal(s);
+	_, _, short := decodeRuneInStringInternal(s);
 	return !short
 }
 
@@ -265,7 +265,7 @@
 		if p[i] < RuneSelf {
 			i++;
 		} else {
-			rune, size := DecodeRune(p[i:len(p)]);
+			_, size := DecodeRune(p[i:len(p)]);
 			i += size;
 		}
 	}
@@ -276,12 +276,12 @@
 func RuneCountInString(s string) int {
 	ei := len(s);
 	i := 0;
-	n := 0;
+	var n int;
 	for n = 0; i < ei; n++ {
 		if s[i] < RuneSelf {
 			i++;
 		} else {
-			rune, size, short := decodeRuneInStringInternal(s[i:ei]);
+			_, size, _ := decodeRuneInStringInternal(s[i:ei]);
 			i += size;
 		}
 	}
