change *map to map; *chan to chan; new(T) to new(*T)
fix bugs left over from *[] to [] conversion.

TBR=r
OCL=21576
CL=21581
diff --git a/src/cmd/gotest/gotest b/src/cmd/gotest/gotest
index 174b1d6..82cc738 100755
--- a/src/cmd/gotest/gotest
+++ b/src/cmd/gotest/gotest
@@ -41,7 +41,7 @@
 set -e
 
 # They all compile; now generate the code to call them.
-#trap "rm -f _testmain.go _testmain.6" 0 1 2 3 14 15
+trap "rm -f _testmain.go _testmain.6" 0 1 2 3 14 15
 {
 	# package spec
 	echo 'package main'
diff --git a/src/lib/bignum.go b/src/lib/bignum.go
index c4a35f2..5b3e6e8 100755
--- a/src/lib/bignum.go
+++ b/src/lib/bignum.go
@@ -164,9 +164,9 @@
 	if n < m {
 		return y.Add(x);
 	}
-	
+
 	c := Digit(0);
-	z := new(Natural, n + 1);
+	z := new(*Natural, n + 1);
 	i := 0;
 	for i < m {
 		t := c + x[i] + y[i];
@@ -193,9 +193,9 @@
 	if n < m {
 		panic("underflow")
 	}
-	
+
 	c := Digit(0);
-	z := new(Natural, n);
+	z := new(*Natural, n);
 	i := 0;
 	for i < m {
 		t := c + x[i] - y[i];
@@ -253,7 +253,7 @@
 	n := len(x);
 	m := len(y);
 
-	z := new(Natural, n + m);
+	z := new(*Natural, n + m);
 	for j := 0; j < m; j++ {
 		d := y[j];
 		if d != 0 {
@@ -296,7 +296,7 @@
 
 func Pack(x []Digit2) *Natural {
 	n := (len(x) + 1) / 2;
-	z := new(Natural, n);
+	z := new(*Natural, n);
 	if len(x) & 1 == 1 {
 		// handle odd len(x)
 		n--;
@@ -376,7 +376,7 @@
 	} else {
 		// general case
 		assert(2 <= m && m <= n);
-		
+
 		// normalize x and y
 		// TODO Instead of multiplying, it would be sufficient to
 		//      shift y such that the normalization condition is
@@ -472,7 +472,7 @@
 func (x *Natural) Shl(s uint) *Natural {
 	n := uint(len(x));
 	m := n + s/W;
-	z := new(Natural, m+1);
+	z := new(*Natural, m+1);
 
 	z[m] = Shl(z[m-n : m], x, s%W);
 
@@ -497,7 +497,7 @@
 	if m > n {  // check for underflow
 		m = 0;
 	}
-	z := new(Natural, m);
+	z := new(*Natural, m);
 
 	Shr(z, x[n-m : n], s%W);
 
@@ -512,7 +512,7 @@
 		return y.And(x);
 	}
 
-	z := new(Natural, m);
+	z := new(*Natural, m);
 	for i := 0; i < m; i++ {
 		z[i] = x[i] & y[i];
 	}
@@ -536,7 +536,7 @@
 		return y.Or(x);
 	}
 
-	z := new(Natural, n);
+	z := new(*Natural, n);
 	for i := 0; i < m; i++ {
 		z[i] = x[i] | y[i];
 	}
@@ -553,7 +553,7 @@
 		return y.Xor(x);
 	}
 
-	z := new(Natural, n);
+	z := new(*Natural, n);
 	for i := 0; i < m; i++ {
 		z[i] = x[i] ^ y[i];
 	}
@@ -630,7 +630,7 @@
 	s := new([]byte, n);
 
 	// don't destroy x
-	t := new(Natural, len(x));
+	t := new(*Natural, len(x));
 	Copy(t, x);
 
 	// convert
@@ -682,7 +682,7 @@
 func MulAdd1(x *Natural, d, c Digit) *Natural {
 	assert(IsSmall(d-1) && IsSmall(c));
 	n := len(x);
-	z := new(Natural, n + 1);
+	z := new(*Natural, n + 1);
 
 	for i := 0; i < n; i++ {
 		t := c + x[i]*d;
@@ -1088,7 +1088,7 @@
 	return s + x.mant.ToString(base);
 }
 
-	
+
 func (x *Integer) String() string {
 	return x.ToString(10);
 }
diff --git a/src/lib/bufio.go b/src/lib/bufio.go
index 8df0073..68be143 100644
--- a/src/lib/bufio.go
+++ b/src/lib/bufio.go
@@ -50,7 +50,7 @@
 	if size <= 0 {
 		return nil, BadBufSize
 	}
-	b = new(BufRead);
+	b = new(*BufRead);
 	b.buf = new([]byte, size);
 	b.rd = rd;
 	return b, nil
@@ -191,11 +191,9 @@
 // For internal (or advanced) use only.
 // Use ReadLineString or ReadLineBytes instead.
 
-var NIL []byte // TODO(rsc): should be able to use nil
-
 func (b *BufRead) ReadLineSlice(delim byte) (line []byte, err *os.Error) {
 	if b.err != nil {
-		return NIL, b.err
+		return nil, b.err
 	}
 
 	// Look in buffer.
@@ -210,7 +208,7 @@
 		n := b.Buffered();
 		b.Fill();
 		if b.err != nil {
-			return NIL, b.err
+			return nil, b.err
 		}
 		if b.Buffered() == n {	// no data added; end of file
 			line := b.buf[b.r:b.w];
@@ -227,12 +225,12 @@
 
 		// Buffer is full?
 		if b.Buffered() >= len(b.buf) {
-			return NIL, BufferFull
+			return nil, BufferFull
 		}
 	}
 
 	// BUG 6g bug100
-	return NIL, nil
+	return nil, nil
 }
 
 // Read until the first occurrence of delim in the input,
@@ -242,7 +240,7 @@
 // we might have read more than the buffer size.)
 func (b *BufRead) ReadLineBytes(delim byte) (line []byte, err *os.Error) {
 	if b.err != nil {
-		return NIL, b.err
+		return nil, b.err
 	}
 
 	// Use ReadLineSlice to look for array,
@@ -279,7 +277,7 @@
 		}
 
 		// Grow list if needed.
-		if len(full) == 0 {
+		if full == nil {
 			full = new([][]byte, 16);
 		} else if nfull >= len(full) {
 			newfull := new([][]byte, len(full)*2);
@@ -313,26 +311,18 @@
 	return buf, err
 }
 
-// BUG(bugs/bug102.go): string(empty bytes array) throws error
-func ToString(p []byte) string {
-	if len(p) == 0 {
-		return ""
-	}
-	return string(p)
-}
-
 // Read until the first occurrence of delim in the input,
 // returning a new string containing the line.
 // If savedelim, keep delim in the result; otherwise chop it off.
 func (b *BufRead) ReadLineString(delim byte, savedelim bool) (line string, err *os.Error) {
 	bytes, e := b.ReadLineBytes(delim);
 	if e != nil {
-		return ToString(bytes), e
+		return string(bytes), e
 	}
 	if !savedelim {
 		bytes = bytes[0:len(bytes)-1]
 	}
-	return ToString(bytes), nil
+	return string(bytes), nil
 }
 
 
@@ -349,7 +339,7 @@
 	if size <= 0 {
 		return nil, BadBufSize
 	}
-	b = new(BufWrite);
+	b = new(*BufWrite);
 	b.buf = new([]byte, size);
 	b.wr = wr;
 	return b, nil
diff --git a/src/lib/bufio_test.go b/src/lib/bufio_test.go
index 897f331..fecc778 100644
--- a/src/lib/bufio_test.go
+++ b/src/lib/bufio_test.go
@@ -34,7 +34,7 @@
 }
 
 func NewByteReader(p []byte) io.Read {
-	b := new(ByteReader);
+	b := new(*ByteReader);
 	b.p = p;
 	return b
 }
@@ -56,7 +56,7 @@
 }
 
 func NewHalfByteReader(p []byte) io.Read {
-	b := new(HalfByteReader);
+	b := new(*HalfByteReader);
 	b.p = p;
 	return b
 }
@@ -80,7 +80,7 @@
 }
 
 func NewRot13Reader(r io.Read) *Rot13Reader {
-	r13 := new(Rot13Reader);
+	r13 := new(*Rot13Reader);
 	r13.r = r;
 	return r13
 }
@@ -238,7 +238,7 @@
 }
 
 func NewByteWriter() WriteBuffer {
-	return new(ByteWriter)
+	return new(*ByteWriter)
 }
 
 func (w *ByteWriter) Write(p []byte) (int, *os.Error) {
@@ -266,7 +266,7 @@
 }
 
 func NewHalfByteWriter() WriteBuffer {
-	w := new(HalfByteWriter);
+	w := new(*HalfByteWriter);
 	w.bw = NewByteWriter();
 	return w
 }
diff --git a/src/lib/container/array/array.go b/src/lib/container/array/array.go
index 5c03536..e87f426 100644
--- a/src/lib/container/array/array.go
+++ b/src/lib/container/array/array.go
@@ -36,7 +36,7 @@
 
 
 export func New(len int) *Array {
-	return new(Array).Init(len)
+	return new(*Array).Init(len)
 }
 
 
diff --git a/src/lib/container/array/intarray.go b/src/lib/container/array/intarray.go
index eb7e839..a02e568 100644
--- a/src/lib/container/array/intarray.go
+++ b/src/lib/container/array/intarray.go
@@ -19,7 +19,7 @@
 
 
 export func NewIntArray(len int) *IntArray {
-	return new(IntArray).Init(len)
+	return new(*IntArray).Init(len)
 }
 
 
diff --git a/src/lib/flag.go b/src/lib/flag.go
index a1189a6..bc962f6 100644
--- a/src/lib/flag.go
+++ b/src/lib/flag.go
@@ -289,8 +289,8 @@
 }
 
 type Flags struct {
-	actual *map[string] *Flag;
-	formal *map[string] *Flag;
+	actual map[string] *Flag;
+	formal map[string] *Flag;
 	first_arg	int;
 	flag_list	*Flag;  // BUG: remove when we can iterate over maps
 }
@@ -318,7 +318,7 @@
 }
 
 func New() *Flags {
-	f := new(Flags);
+	f := new(*Flags);
 	f.first_arg = 1;	// 0 is the program name, 1 is first arg
 	f.actual = new(map[string] *Flag);
 	f.formal = new(map[string] *Flag);
@@ -361,7 +361,7 @@
 }
 
 func Add(name string, value Value, usage string) *Flag {
-	f := new(Flag);
+	f := new(*Flag);
 	f.name = name;
 	f.usage = usage;
 	f.value = value;
diff --git a/src/lib/hash/adler32.go b/src/lib/hash/adler32.go
index cebbfb2..f1aa732 100644
--- a/src/lib/hash/adler32.go
+++ b/src/lib/hash/adler32.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Adler-32 checksum. 
+// Adler-32 checksum.
 // Defined in RFC 1950:
 //	Adler-32 is composed of two sums accumulated per byte: s1 is
 //	the sum of all bytes, s2 is the sum of all s1 values. Both sums
diff --git a/src/lib/hash/crc32.go b/src/lib/hash/crc32.go
index 4ab8495..9f6aa7d 100644
--- a/src/lib/hash/crc32.go
+++ b/src/lib/hash/crc32.go
@@ -25,7 +25,7 @@
 	Koopman = 0xeb31d82e;
 )
 
-// TODO(rsc): Change to [256]uint32
+// TODO(rsc): Change to [256]uint32 once 6g can handle it.
 export type Table []uint32
 
 export func MakeTable(poly uint32) Table {
diff --git a/src/lib/hash/md5.go b/src/lib/hash/md5.go
index 7e90e34..773ff4a 100644
--- a/src/lib/hash/md5.go
+++ b/src/lib/hash/md5.go
@@ -27,7 +27,7 @@
 }
 
 export func NewDigest() *Digest {
-	d := new(Digest);
+	d := new(*Digest);
 	d.s[0] = A;
 	d.s[1] = B;
 	d.s[2] = C;
diff --git a/src/lib/hash/sha1.go b/src/lib/hash/sha1.go
index 3aa6903..9733347 100644
--- a/src/lib/hash/sha1.go
+++ b/src/lib/hash/sha1.go
@@ -28,7 +28,7 @@
 }
 
 export func NewDigest() *Digest {
-	d := new(Digest);
+	d := new(*Digest);
 	d.h[0] = H0;
 	d.h[1] = H1;
 	d.h[2] = H2;
diff --git a/src/lib/http/conn.go b/src/lib/http/conn.go
index 15c0707..ec33d9e 100644
--- a/src/lib/http/conn.go
+++ b/src/lib/http/conn.go
@@ -22,7 +22,7 @@
 
 // Create new connection from rwc.
 export func NewConn(rwc io.ReadWriteClose) (c *Conn, err *os.Error) {
-	c = new(Conn);
+	c = new(*Conn);
 	c.rwc = rwc;
 	if c.br, err = bufio.NewBufRead(rwc); err != nil {
 		return nil, err
diff --git a/src/lib/http/request.go b/src/lib/http/request.go
index 36fa770..c997ee8 100644
--- a/src/lib/http/request.go
+++ b/src/lib/http/request.go
@@ -37,7 +37,7 @@
 	pmajor int;	// 1
 	pminor int;	// 0
 
-	header *map[string] string;
+	header map[string] string;
 
 	close bool;
 	host string;
@@ -45,18 +45,16 @@
 	useragent string;
 }
 
-var NIL []byte // TODO(rsc)
-
 // Read a line of bytes (up to \n) from b.
 // Give up if the line exceeds MaxLineLength.
 // The returned bytes are a pointer into storage in
 // the bufio, so they are only valid until the next bufio read.
 func ReadLineBytes(b *bufio.BufRead) (p []byte, err *os.Error) {
 	if p, err = b.ReadLineSlice('\n'); err != nil {
-		return NIL, err
+		return nil, err
 	}
 	if len(p) >= MaxLineLength {
-		return NIL, LineTooLong
+		return nil, LineTooLong
 	}
 
 	// Chop off trailing white space.
@@ -183,7 +181,7 @@
 
 // Read and parse a request from b.
 export func ReadRequest(b *bufio.BufRead) (req *Request, err *os.Error) {
-	req = new(Request);
+	req = new(*Request);
 
 	// First line: GET /index.html HTTP/1.0
 	var s string;
diff --git a/src/lib/http/url.go b/src/lib/http/url.go
index 8df18eb..b985c97 100644
--- a/src/lib/http/url.go
+++ b/src/lib/http/url.go
@@ -131,7 +131,7 @@
 	if rawurl == "" {
 		return nil, BadURL
 	}
-	url = new(URL);
+	url = new(*URL);
 	url.raw = rawurl;
 
 	// Split off possible leading "http:", "mailto:", etc.
diff --git a/src/lib/io/bytebuffer.go b/src/lib/io/bytebuffer.go
index d06f148..f85679c 100644
--- a/src/lib/io/bytebuffer.go
+++ b/src/lib/io/bytebuffer.go
@@ -81,7 +81,7 @@
 
 
 export func NewByteBufferFromArray(buf []byte) *ByteBuffer {
-	b := new(ByteBuffer);
+	b := new(*ByteBuffer);
 	b.buf = buf;
 	b.off = 0;
 	b.len = len(buf);
diff --git a/src/lib/json/generic.go b/src/lib/json/generic.go
index abdcd95..4f42684 100644
--- a/src/lib/json/generic.go
+++ b/src/lib/json/generic.go
@@ -99,7 +99,7 @@
 	return "false"
 }
 
-type Map struct { m *map[string]Json; Null }
+type Map struct { m map[string]Json; Null }
 func (j *Map) Kind() int { return MapKind }
 func (j *Map) Get(s string) Json {
 	if j.m == nil {
@@ -212,7 +212,7 @@
 	i int;
 
 	// or to m[k] (can't set ptr = &m[k])
-	m *map[string] Json;
+	m map[string] Json;
 	k string;
 }
 
@@ -273,7 +273,7 @@
 }
 
 func (b *JsonBuilder) Elem(i int) Builder {
-	bb := new(JsonBuilder);
+	bb := new(*JsonBuilder);
 	bb.a = b.Get().(*Array).a;
 	bb.i = i;
 	for i >= bb.a.Len() {
@@ -283,7 +283,7 @@
 }
 
 func (b *JsonBuilder) Key(k string) Builder {
-	bb := new(JsonBuilder);
+	bb := new(*JsonBuilder);
 	bb.m = b.Get().(*Map).m;
 	bb.k = k;
 	bb.m[k] = null;
@@ -293,7 +293,7 @@
 export func StringToJson(s string) (json Json, ok bool, errtok string) {
 	var errindx int;
 	var j Json;
-	b := new(JsonBuilder);
+	b := new(*JsonBuilder);
 	b.ptr = &j;
 	ok, errindx, errtok = Parse(s, b);
 	if !ok {
diff --git a/src/lib/json/parse.go b/src/lib/json/parse.go
index 1373a12..f38bb59 100644
--- a/src/lib/json/parse.go
+++ b/src/lib/json/parse.go
@@ -120,7 +120,7 @@
 export func Quote(s string) string {
 	chr := new([]byte, utf8.UTFMax);
 	chr0 := chr[0:1];
-	b := new(io.ByteBuffer);
+	b := new(*io.ByteBuffer);
 	chr[0] = '"';
 	b.Write(chr0);
 	for i := 0; i < len(s); i++ {
@@ -387,7 +387,7 @@
 }
 
 export func Parse(s string, build Builder) (ok bool, errindx int, errtok string) {
-	lex := new(Lexer);
+	lex := new(*Lexer);
 	lex.s = s;
 	lex.Next();
 	if ParseValue(lex, build) {
diff --git a/src/lib/json/struct_test.go b/src/lib/json/struct_test.go
index 85dbd88..9f8615a 100644
--- a/src/lib/json/struct_test.go
+++ b/src/lib/json/struct_test.go
@@ -26,7 +26,7 @@
 	fl float;
 	fl32 float32;
 	fl64 float64;
-	a []string;
+	a *[]string;	// TODO(rsc): Should be able to use []string.
 	my *MyStruct;
 };
 
@@ -69,7 +69,7 @@
 	Check(t, m.fl==11.5, "fl", m.fl);
 	Check(t, m.fl32==12.25, "fl32", m.fl32);
 	Check(t, m.fl64==13.75, "fl64", m.fl64);
-//	Check(t, m.a!=nil, "a", m.a);	// TODO(rsc): uncomment once []string as interface works
+	Check(t, m.a!=nil, "a", m.a);
 	if m.a != nil {
 		Check(t, m.a[0]=="x", "a[0]", m.a[0]);
 		Check(t, m.a[1]=="y", "a[1]", m.a[1]);
diff --git a/src/lib/net/dialgoogle_test.go b/src/lib/net/dialgoogle_test.go
index c23d7b7..684439d 100644
--- a/src/lib/net/dialgoogle_test.go
+++ b/src/lib/net/dialgoogle_test.go
@@ -22,7 +22,7 @@
 	req := io.StringBytes("GET / HTTP/1.0\r\nHost: www.google.com\r\n\r\n");
 	n, errno := fd.Write(req);
 
-	buf := new([1000]byte);
+	buf := new([]byte, 1000);
 	n, errno = io.Readn(fd, buf);
 
 	if n < 1000 {
diff --git a/src/lib/net/dnsclient.go b/src/lib/net/dnsclient.go
index 2e8c638..eff46f8 100644
--- a/src/lib/net/dnsclient.go
+++ b/src/lib/net/dnsclient.go
@@ -44,7 +44,7 @@
 	if len(name) >= 256 {
 		return nil, DNS_NameTooLong
 	}
-	out := new(DNS_Msg);
+	out := new(*DNS_Msg);
 	out.id = 0x1234;
 	out.question = []DNS_Question{
 		DNS_Question{ name, DNS_TypeA, DNS_ClassINET }
@@ -71,7 +71,7 @@
 			continue
 		}
 		buf = buf[0:n];
-		in := new(DNS_Msg);
+		in := new(*DNS_Msg);
 		if !in.Unpack(buf) || in.id != out.id {
 			continue
 		}
@@ -80,24 +80,22 @@
 	return nil, DNS_NoAnswer
 }
 
-var NIL []string // TODO(rsc)
-
 
 // Find answer for name in dns message.
 // On return, if err == nil, addrs != nil.
 // TODO(rsc): Maybe return [][]byte (==[]IPAddr) instead?
 func Answer(name string, dns *DNS_Msg) (addrs []string, err *os.Error) {
-	addrs = new([]string, len(dns.answer))[0:0];
+	addrs = new([]string, 0, len(dns.answer));
 
 	if dns.rcode == DNS_RcodeNameError && dns.authoritative {
-		return NIL, DNS_NameNotFound	// authoritative "no such host"
+		return nil, DNS_NameNotFound	// authoritative "no such host"
 	}
 	if dns.rcode != DNS_RcodeSuccess {
 		// None of the error codes make sense
 		// for the query we sent.  If we didn't get
 		// a name error and we didn't get success,
 		// the server is behaving incorrectly.
-		return NIL, DNS_ServerFailure
+		return nil, DNS_ServerFailure
 	}
 
 	// Look for the name.
@@ -126,13 +124,13 @@
 			}
 		}
 		if len(addrs) == 0 {
-			return NIL, DNS_NameNotFound
+			return nil, DNS_NameNotFound
 		}
 		return addrs, nil
 	}
 
 	// Too many redirects
-	return NIL, DNS_RedirectLoop
+	return nil, DNS_RedirectLoop
 }
 
 // Do a lookup for a single name, which must be rooted
diff --git a/src/lib/net/dnsconfig.go b/src/lib/net/dnsconfig.go
index 0dff681..5c2b458 100644
--- a/src/lib/net/dnsconfig.go
+++ b/src/lib/net/dnsconfig.go
@@ -31,7 +31,7 @@
 	if file == nil {
 		return nil
 	}
-	conf := new(DNS_Config);
+	conf := new(*DNS_Config);
 	conf.servers = new([]string, 3)[0:0];		// small, but the standard limit
 	conf.search = new([]string, 0);
 	conf.ndots = 1;
diff --git a/src/lib/net/dnsmsg.go b/src/lib/net/dnsmsg.go
index a94d039..1c85c93 100644
--- a/src/lib/net/dnsmsg.go
+++ b/src/lib/net/dnsmsg.go
@@ -198,18 +198,18 @@
 
 // Map of constructors for each RR wire type.
 var rr_mk = map[int]*()DNS_RR {
-	DNS_TypeCNAME: func() DNS_RR { return new(DNS_RR_CNAME) },
-	DNS_TypeHINFO: func() DNS_RR { return new(DNS_RR_HINFO) },
-	DNS_TypeMB: func() DNS_RR { return new(DNS_RR_MB) },
-	DNS_TypeMG: func() DNS_RR { return new(DNS_RR_MG) },
-	DNS_TypeMINFO: func() DNS_RR { return new(DNS_RR_MINFO) },
-	DNS_TypeMR: func() DNS_RR { return new(DNS_RR_MR) },
-	DNS_TypeMX: func() DNS_RR { return new(DNS_RR_MX) },
-	DNS_TypeNS: func() DNS_RR { return new(DNS_RR_NS) },
-	DNS_TypePTR: func() DNS_RR { return new(DNS_RR_PTR) },
-	DNS_TypeSOA: func() DNS_RR { return new(DNS_RR_SOA) },
-	DNS_TypeTXT: func() DNS_RR { return new(DNS_RR_TXT) },
-	DNS_TypeA: func() DNS_RR { return new(DNS_RR_A) },
+	DNS_TypeCNAME: func() DNS_RR { return new(*DNS_RR_CNAME) },
+	DNS_TypeHINFO: func() DNS_RR { return new(*DNS_RR_HINFO) },
+	DNS_TypeMB: func() DNS_RR { return new(*DNS_RR_MB) },
+	DNS_TypeMG: func() DNS_RR { return new(*DNS_RR_MG) },
+	DNS_TypeMINFO: func() DNS_RR { return new(*DNS_RR_MINFO) },
+	DNS_TypeMR: func() DNS_RR { return new(*DNS_RR_MR) },
+	DNS_TypeMX: func() DNS_RR { return new(*DNS_RR_MX) },
+	DNS_TypeNS: func() DNS_RR { return new(*DNS_RR_NS) },
+	DNS_TypePTR: func() DNS_RR { return new(*DNS_RR_PTR) },
+	DNS_TypeSOA: func() DNS_RR { return new(*DNS_RR_SOA) },
+	DNS_TypeTXT: func() DNS_RR { return new(*DNS_RR_TXT) },
+	DNS_TypeA: func() DNS_RR { return new(*DNS_RR_A) },
 }
 
 // Pack a domain name s into msg[off:].
@@ -545,7 +545,6 @@
 	extra []DNS_RR;
 }
 
-var NIL []byte // TODO(rsc): remove
 
 func (dns *DNS_Msg) Pack() (msg []byte, ok bool) {
 	var dh DNS_Header;
@@ -569,9 +568,11 @@
 		dh.bits |= QR;
 	}
 
-	// Prepare variable sized arrays; paper over nils.
-	var question []DNS_Question;
-	var answer, ns, extra []DNS_RR;
+	// Prepare variable sized arrays.
+	question := dns.question;
+	answer := dns.answer;
+	ns := dns.ns;
+	extra := dns.extra;
 
 	dh.qdcount = uint16(len(question));
 	dh.ancount = uint16(len(answer));
@@ -599,7 +600,7 @@
 		off, ok = PackStruct(extra[i], msg, off);
 	}
 	if !ok {
-		return NIL, false
+		return nil, false
 	}
 	return msg[0:off], true
 }
diff --git a/src/lib/net/fd.go b/src/lib/net/fd.go
index 600ac38..a9c90c8 100644
--- a/src/lib/net/fd.go
+++ b/src/lib/net/fd.go
@@ -19,8 +19,8 @@
 	// immutable until Close
 	fd int64;
 	osfd *os.FD;
-	cr *chan *FD;
-	cw *chan *FD;
+	cr chan *FD;
+	cw chan *FD;
 
 	// owned by fd wait server
 	ncr, ncw int;
@@ -70,15 +70,15 @@
 // might help batch requests.
 
 type PollServer struct {
-	cr, cw *chan *FD;	// buffered >= 1
+	cr, cw chan *FD;	// buffered >= 1
 	pr, pw *os.FD;
-	pending *map[int64] *FD;
+	pending map[int64] *FD;
 	poll *Pollster;	// low-level OS hooks
 }
 func (s *PollServer) Run();
 
 func NewPollServer() (s *PollServer, err *os.Error) {
-	s = new(PollServer);
+	s = new(*PollServer);
 	s.cr = new(chan *FD, 1);
 	s.cw = new(chan *FD, 1);
 	if s.pr, s.pw, err = os.Pipe(); err != nil {
@@ -214,7 +214,7 @@
 	if err = SetNonblock(fd); err != nil {
 		return nil, err
 	}
-	f = new(FD);
+	f = new(*FD);
 	f.fd = fd;
 	f.osfd = os.NewFD(fd);
 	f.cr = new(chan *FD, 1);
diff --git a/src/lib/net/fd_darwin.go b/src/lib/net/fd_darwin.go
index b0eaf05..5a21be5 100644
--- a/src/lib/net/fd_darwin.go
+++ b/src/lib/net/fd_darwin.go
@@ -18,10 +18,8 @@
 	events []syscall.Kevent;
 }
 
-var NIL []syscall.Kevent;  // TODO(rsc): remove
-
 export func NewPollster() (p *Pollster, err *os.Error) {
-	p = new(Pollster);
+	p = new(*Pollster);
 	var e int64;
 	if p.kq, e = syscall.kqueue(); e != 0 {
 		return nil, os.ErrnoToError(e)
@@ -66,7 +64,7 @@
 
 func (p *Pollster) WaitFD() (fd int64, mode int, err *os.Error) {
 	for len(p.events) == 0 {
-		nn, e := syscall.kevent(p.kq, NIL, p.eventbuf, nil);
+		nn, e := syscall.kevent(p.kq, nil, p.eventbuf, nil);
 		if e != 0 {
 			if e == syscall.EAGAIN || e == syscall.EINTR {
 				continue
diff --git a/src/lib/net/fd_linux.go b/src/lib/net/fd_linux.go
index 282be20..e459ddd 100644
--- a/src/lib/net/fd_linux.go
+++ b/src/lib/net/fd_linux.go
@@ -21,11 +21,11 @@
 	epfd int64;
 
 	// Events we're already waiting for
-	events *map[int64] uint32;
+	events map[int64] uint32;
 }
 
 export func NewPollster() (p *Pollster, err *os.Error) {
-	p = new(Pollster);
+	p = new(*Pollster);
 	var e int64;
 
 	// The arg to epoll_create is a hint to the kernel
@@ -102,9 +102,9 @@
 	// Get an event.
 	var evarray [1]syscall.EpollEvent;
 	ev := &evarray[0];
-	n, e := syscall.epoll_wait(p.epfd, &evarray, -1);
+	n, e := syscall.epoll_wait(p.epfd, evarray, -1);
 	for e == syscall.EAGAIN || e == syscall.EINTR {
-		n, e = syscall.epoll_wait(p.epfd, &evarray, -1)
+		n, e = syscall.epoll_wait(p.epfd, evarray, -1)
 	}
 	if e != 0 {
 		return -1, 0, os.ErrnoToError(e)
diff --git a/src/lib/net/ip.go b/src/lib/net/ip.go
index 4cf56dc..883a1c6 100644
--- a/src/lib/net/ip.go
+++ b/src/lib/net/ip.go
@@ -39,8 +39,6 @@
 // Well-known IP addresses
 export var IPv4bcast, IPv4allsys, IPv4allrouter, IPv4prefix, IPallbits, IPnoaddr []byte
 
-var NIL []byte // TODO(rsc)
-
 func init() {
 	IPv4bcast = MakeIPv4(0xff, 0xff, 0xff, 0xff);
 	IPv4allsys = MakeIPv4(0xe0, 0x00, 0x00, 0x01);
@@ -75,7 +73,7 @@
 	&& p[11] == 0xff {
 		return p[12:16]
 	}
-	return NIL
+	return nil
 }
 
 // Convert p to IPv6 form.
@@ -86,7 +84,7 @@
 	if len(p) == IPv6len {
 		return p
 	}
-	return NIL
+	return nil
 }
 
 // Default route masks for IPv4.
@@ -97,8 +95,8 @@
 )
 
 export func DefaultMask(p []byte) []byte {
-	if p = ToIPv4(p); len(p) == 0 {
-		return NIL
+	if p = ToIPv4(p); p == nil {
+		return nil
 	}
 	switch true {
 	case p[0] < 0x80:
@@ -108,14 +106,14 @@
 	default:
 		return ClassCMask;
 	}
-	return NIL;	// not reached
+	return nil;	// not reached
 }
 
 // Apply mask to ip, returning new address.
 export func Mask(ip []byte, mask []byte) []byte {
 	n := len(ip);
 	if n != len(mask) {
-		return NIL
+		return nil
 	}
 	out := new([]byte, n);
 	for i := 0; i < n; i++ {
@@ -253,7 +251,7 @@
 	for j := 0; j < IPv4len; j++ {
 		if j > 0 {
 			if s[i] != '.' {
-				return NIL
+				return nil
 			}
 			i++;
 		}
@@ -263,12 +261,12 @@
 		)
 		n, i, ok = Dtoi(s, i);
 		if !ok || n > 0xFF {
-			return NIL
+			return nil
 		}
 		p[j] = byte(n)
 	}
 	if i != len(s) {
-		return NIL
+		return nil
 	}
 	return MakeIPv4(p[0], p[1], p[2], p[3])
 }
@@ -302,22 +300,22 @@
 		// Hex number.
 		n, i1, ok := Xtoi(s, i);
 		if !ok || n > 0xFFFF {
-			return NIL
+			return nil
 		}
 
 		// If followed by dot, might be in trailing IPv4.
 		if i1 < len(s) && s[i1] == '.' {
 			if ellipsis < 0 && j != IPv6len - IPv4len {
 				// Not the right place.
-				return NIL
+				return nil
 			}
 			if j+IPv4len > IPv6len {
 				// Not enough room.
-				return NIL
+				return nil
 			}
 			p4 := ParseIPv4(s[i:len(s)]);
-			if len(p4) == 0 {
-				return NIL
+			if p4 == nil {
+				return nil
 			}
 			// BUG: p[j:j+4] = p4
 			p[j] = p4[12];
@@ -342,14 +340,14 @@
 
 		// Otherwise must be followed by colon and more.
 		if s[i] != ':' && i+1 == len(s) {
-			return NIL
+			return nil
 		}
 		i++;
 
 		// Look for ellipsis.
 		if s[i] == ':' {
 			if ellipsis >= 0 {	// already have one
-				return NIL
+				return nil
 			}
 			ellipsis = j;
 			if i++; i == len(s) {	// can be at end
@@ -360,13 +358,13 @@
 
 	// Must have used entire string.
 	if i != len(s) {
-		return NIL
+		return nil
 	}
 
 	// If didn't parse enough, expand ellipsis.
 	if j < IPv6len {
 		if ellipsis < 0 {
-			return NIL
+			return nil
 		}
 		n := IPv6len - j;
 		for k := j-1; k >= ellipsis; k-- {
@@ -381,7 +379,7 @@
 
 export func ParseIP(s string) []byte {
 	p := ParseIPv4(s);
-	if len(p) != 0 {
+	if p != nil {
 		return p
 	}
 	return ParseIPv6(s)
diff --git a/src/lib/net/net.go b/src/lib/net/net.go
index ca5f337..2fae03e 100644
--- a/src/lib/net/net.go
+++ b/src/lib/net/net.go
@@ -62,8 +62,6 @@
 	return host + ":" + port
 }
 
-var NIL []byte
-
 // Convert "host:port" into IP address and port.
 // For now, host and port must be numeric literals.
 // Eventually, we'll have name resolution.
@@ -71,24 +69,24 @@
 	var host, port string;
 	host, port, err = SplitHostPort(hostport);
 	if err != nil {
-		return NIL, 0, err
+		return nil, 0, err
 	}
 
 	// Try as an IP address.
 	addr := ParseIP(host);
-	if len(addr) == 0 {
+	if addr == nil {
 		// Not an IP address.  Try as a DNS name.
 		hostname, addrs, err := LookupHost(host);
 		if err != nil {
-			return NIL, 0, err
+			return nil, 0, err
 		}
 		if len(addrs) == 0 {
-			return NIL, 0, UnknownHost
+			return nil, 0, UnknownHost
 		}
 		addr = ParseIP(addrs[0]);
-		if len(addr) == 0 {
+		if addr == nil {
 			// should not happen
-			return NIL, 0, BadAddress
+			return nil, 0, BadAddress
 		}
 	}
 
@@ -96,11 +94,11 @@
 	if !ok || i != len(port) {
 		p, ok = LookupPort(net, port);
 		if !ok {
-			return NIL, 0, UnknownPort
+			return nil, 0, UnknownPort
 		}
 	}
 	if p < 0 || p > 0xFFFF {
-		return NIL, 0, BadAddress
+		return nil, 0, BadAddress
 	}
 
 	return addr, p, nil
@@ -311,7 +309,7 @@
 	default:
 		// Otherwise, guess.
 		// If the addresses are IPv4 and we prefer IPv4, use 4; else 6.
-		if PreferIPv4 && len(ToIPv4(lip)) != 0 && len(ToIPv4(rip)) != 0 {
+		if PreferIPv4 && ToIPv4(lip) != nil && ToIPv4(rip) != nil {
 			vers = 4
 		} else {
 			vers = 6
@@ -329,13 +327,13 @@
 	}
 
 	var la, ra *syscall.Sockaddr;
-	if len(lip) != 0 {
+	if lip != nil {
 		la, lerr = cvt(lip, lport);
 		if lerr != nil {
 			return nil, lerr
 		}
 	}
-	if len(rip) != 0 {
+	if rip != nil {
 		ra, rerr = cvt(rip, rport);
 		if rerr != nil {
 			return nil, rerr
@@ -361,7 +359,7 @@
 }
 
 func NewConnTCP(fd *FD, raddr string) *ConnTCP {
-	c := new(ConnTCP);
+	c := new(*ConnTCP);
 	c.fd = fd;
 	c.raddr = raddr;
 	c.SetNoDelay(true);
@@ -389,7 +387,7 @@
 }
 
 func NewConnUDP(fd *FD, raddr string) *ConnUDP {
-	c := new(ConnUDP);
+	c := new(*ConnUDP);
 	c.fd = fd;
 	c.raddr = raddr;
 	return c
@@ -488,7 +486,7 @@
 		syscall.close(fd.fd);
 		return nil, os.ErrnoToError(e1)
 	}
-	l = new(ListenerTCP);
+	l = new(*ListenerTCP);
 	l.fd = fd;
 	return l, nil
 }
diff --git a/src/lib/net/net_darwin.go b/src/lib/net/net_darwin.go
index 2a23dec..9d143d3 100644
--- a/src/lib/net/net_darwin.go
+++ b/src/lib/net/net_darwin.go
@@ -13,10 +13,10 @@
 
 export func IPv4ToSockaddr(p []byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
 	p = ToIPv4(p);
-	if len(p) == 0 || port < 0 || port > 0xFFFF {
+	if p == nil || port < 0 || port > 0xFFFF {
 		return nil, os.EINVAL
 	}
-	sa := new(syscall.SockaddrInet4);
+	sa := new(*syscall.SockaddrInet4);
 	sa.len = syscall.SizeofSockaddrInet4;
 	sa.family = syscall.AF_INET;
 	sa.port[0] = byte(port>>8);
@@ -29,10 +29,10 @@
 
 export func IPv6ToSockaddr(p []byte, port int) (sa1 *syscall.Sockaddr, err *os.Error) {
 	p = ToIPv6(p);
-	if len(p) == 0 || port < 0 || port > 0xFFFF {
+	if p == nil || port < 0 || port > 0xFFFF {
 		return nil, os.EINVAL
 	}
-	sa := new(syscall.SockaddrInet6);
+	sa := new(*syscall.SockaddrInet6);
 	sa.len = syscall.SizeofSockaddrInet6;
 	sa.family = syscall.AF_INET6;
 	sa.port[0] = byte(port>>8);
@@ -43,28 +43,27 @@
 	return unsafe.pointer(sa).(*syscall.Sockaddr), nil
 }
 
-var NIL []byte	// TODO(rsc)
 
 export func SockaddrToIP(sa1 *syscall.Sockaddr) (p []byte, port int, err *os.Error) {
 	switch sa1.family {
 	case syscall.AF_INET:
 		sa := unsafe.pointer(sa1).(*syscall.SockaddrInet4);
 		a := ToIPv6(sa.addr);
-		if len(a) == 0 {
-			return NIL, 0, os.EINVAL
+		if a == nil {
+			return nil, 0, os.EINVAL
 		}
 		return a, int(sa.port[0])<<8 + int(sa.port[1]), nil;
 	case syscall.AF_INET6:
 		sa := unsafe.pointer(sa1).(*syscall.SockaddrInet6);
 		a := ToIPv6(sa.addr);
-		if len(a) == 0 {
-			return NIL, 0, os.EINVAL
+		if a == nil {
+			return nil, 0, os.EINVAL
 		}
-		return NIL, int(sa.port[0])<<8 + int(sa.port[1]), nil;
+		return nil, int(sa.port[0])<<8 + int(sa.port[1]), nil;
 	default:
-		return NIL, 0, os.EINVAL
+		return nil, 0, os.EINVAL
 	}
-	return NIL, 0, nil	// not reached
+	return nil, 0, nil	// not reached
 }
 
 export func ListenBacklog() int64 {
diff --git a/src/lib/net/net_linux.go b/src/lib/net/net_linux.go
index 3d9dd69..028e6e2 100644
--- a/src/lib/net/net_linux.go
+++ b/src/lib/net/net_linux.go
@@ -16,7 +16,7 @@
 	if p == nil || port < 0 || port > 0xFFFF {
 		return nil, os.EINVAL
 	}
-	sa := new(syscall.SockaddrInet4);
+	sa := new(*syscall.SockaddrInet4);
 	sa.family = syscall.AF_INET;
 	sa.port[0] = byte(port>>8);
 	sa.port[1] = byte(port);
@@ -38,10 +38,10 @@
 	// In IPv6 mode, Linux treats that as meaning "announce on 0.0.0.0",
 	// which it refuses to do.  Rewrite to the IPv6 all zeros.
 	if p4 := ToIPv4(p); p4 != nil && p4[0] == 0 && p4[1] == 0 && p4[2] == 0 && p4[3] == 0 {
-		p = &IPv6zero;
+		p = IPv6zero;
 	}
 
-	sa := new(syscall.SockaddrInet6);
+	sa := new(*syscall.SockaddrInet6);
 	sa.family = syscall.AF_INET6;
 	sa.port[0] = byte(port>>8);
 	sa.port[1] = byte(port);
@@ -55,14 +55,14 @@
 	switch sa1.family {
 	case syscall.AF_INET:
 		sa := unsafe.pointer(sa1).(*syscall.SockaddrInet4);
-		a := ToIPv6(&sa.addr);
+		a := ToIPv6(sa.addr);
 		if a == nil {
 			return nil, 0, os.EINVAL
 		}
 		return a, int(sa.port[0])<<8 + int(sa.port[1]), nil;
 	case syscall.AF_INET6:
 		sa := unsafe.pointer(sa1).(*syscall.SockaddrInet6);
-		a := ToIPv6(&sa.addr);
+		a := ToIPv6(sa.addr);
 		if a == nil {
 			return nil, 0, os.EINVAL
 		}
diff --git a/src/lib/net/port.go b/src/lib/net/port.go
index 5ff1e58..efcbc0a 100644
--- a/src/lib/net/port.go
+++ b/src/lib/net/port.go
@@ -14,10 +14,10 @@
 	"strconv";
 )
 
-var services *map[string] *map[string] int
+var services map[string] map[string] int
 
 func ReadServices() {
-	services = new(map[string] *map[string] int);
+	services = new(map[string] map[string] int);
 	file := Open("/etc/services");
 	for line, ok := file.ReadLine(); ok; line, ok = file.ReadLine() {
 		// "http 80/tcp www www-http # World Wide Web HTTP"
diff --git a/src/lib/net/tcpserver_test.go b/src/lib/net/tcpserver_test.go
index 9489c8c..0e50369 100644
--- a/src/lib/net/tcpserver_test.go
+++ b/src/lib/net/tcpserver_test.go
@@ -11,7 +11,7 @@
 	"testing";
 )
 
-func Echo(fd io.ReadWrite, done *chan<- int) {
+func Echo(fd io.ReadWrite, done chan<- int) {
 	var buf [1024]byte;
 
 	for {
@@ -24,7 +24,7 @@
 	done <- 1
 }
 
-func Serve(t *testing.T, network, addr string, listening, done *chan<- int) {
+func Serve(t *testing.T, network, addr string, listening, done chan<- int) {
 	l, err := net.Listen(network, addr);
 	if err != nil {
 		t.Fatalf("net.Listen(%q, %q) = _, %v", network, addr, err);
@@ -76,9 +76,9 @@
 }
 
 export func TestTcpServer(t *testing.T) {
-	DoTest(t,  "tcp", "0.0.0.0:9999", "127.0.0.1:9999");
-	DoTest(t, "tcp", "[::]:9999", "[::ffff:127.0.0.1]:9999");
-	DoTest(t, "tcp", "[::]:9999", "127.0.0.1:9999");
-	DoTest(t, "tcp", "0.0.0.0:9999", "[::ffff:127.0.0.1]:9999");
+	DoTest(t,  "tcp", "0.0.0.0:9997", "127.0.0.1:9997");
+	DoTest(t, "tcp", "[::]:9997", "[::ffff:127.0.0.1]:9997");
+	DoTest(t, "tcp", "[::]:9997", "127.0.0.1:9997");
+	DoTest(t, "tcp", "0.0.0.0:9997", "[::ffff:127.0.0.1]:9997");
 }
 
diff --git a/src/lib/once.go b/src/lib/once.go
index 7585a44..414f288 100644
--- a/src/lib/once.go
+++ b/src/lib/once.go
@@ -13,12 +13,12 @@
 
 type Job struct {
 	done bool;
-	doit *chan bool;	// buffer of 1
+	doit chan bool;	// buffer of 1
 }
 
 type Request struct {
 	f *();
-	reply *chan *Job
+	reply chan *Job
 }
 
 // TODO: Would like to use chan Request but 6g rejects it.
@@ -34,7 +34,7 @@
 		req := <-service;
 		job, present := jobmap[req.f];
 		if !present {
-			job = new(Job);
+			job = new(*Job);
 			job.doit = new(chan bool, 1);
 			job.doit <- true;
 			jobmap[req.f] = job
diff --git a/src/lib/regexp/regexp.go b/src/lib/regexp/regexp.go
index 2176c4d..218fbd6 100644
--- a/src/lib/regexp/regexp.go
+++ b/src/lib/regexp/regexp.go
@@ -48,7 +48,7 @@
 
 type RE struct {
 	expr	string;	// the original expression
-	ch	*chan<- *RE;	// reply channel when we're done
+	ch	chan<- *RE;	// reply channel when we're done
 	error	*os.Error;	// compile- or run-time error; nil if OK
 	inst	*array.Array;
 	start	Inst;
@@ -112,7 +112,7 @@
 func (char *Char) Print() { print("char ", string(char.char)) }
 
 func NewChar(char int) *Char {
-	c := new(Char);
+	c := new(*Char);
 	c.char = char;
 	return c;
 }
@@ -163,7 +163,7 @@
 }
 
 func NewCharClass() *CharClass {
-	c := new(CharClass);
+	c := new(*CharClass);
 	c.ranges = array.NewIntArray(0);
 	return c;
 }
@@ -249,7 +249,7 @@
 }
 
 func NewParser(re *RE) *Parser {
-	parser := new(Parser);
+	parser := new(*Parser);
 	parser.re = re;
 	parser.nextc();	// load p.ch
 	return parser;
@@ -364,15 +364,15 @@
 		p.re.Error(ErrUnmatchedRbkt);
 	case '^':
 		p.nextc();
-		start = p.re.Add(new(Bot));
+		start = p.re.Add(new(*Bot));
 		return start, start;
 	case '$':
 		p.nextc();
-		start = p.re.Add(new(Eot));
+		start = p.re.Add(new(*Eot));
 		return start, start;
 	case '.':
 		p.nextc();
-		start = p.re.Add(new(Any));
+		start = p.re.Add(new(*Any));
 		return start, start;
 	case '[':
 		p.nextc();
@@ -393,9 +393,9 @@
 		}
 		p.nlpar--;
 		p.nextc();
-		bra := new(Bra);
+		bra := new(*Bra);
 		p.re.Add(bra);
-		ebra := new(Ebra);
+		ebra := new(*Ebra);
 		p.re.Add(ebra);
 		bra.n = nbra;
 		ebra.n = nbra;
@@ -437,7 +437,7 @@
 	switch p.c() {
 	case '*':
 		// (start,end)*:
-		alt := new(Alt);
+		alt := new(*Alt);
 		p.re.Add(alt);
 		end.SetNext(alt);	// after end, do alt
 		alt.left = start;	// alternate brach: return to start
@@ -445,16 +445,16 @@
 		end = alt;
 	case '+':
 		// (start,end)+:
-		alt := new(Alt);
+		alt := new(*Alt);
 		p.re.Add(alt);
 		end.SetNext(alt);	// after end, do alt
 		alt.left = start;	// alternate brach: return to start
 		end = alt;	// start is unchanged; end is alt
 	case '?':
 		// (start,end)?:
-		alt := new(Alt);
+		alt := new(*Alt);
 		p.re.Add(alt);
-		nop := new(Nop);
+		nop := new(*Nop);
 		p.re.Add(nop);
 		alt.left = start;	// alternate branch is start
 		alt.next = nop;	// follow on to nop
@@ -478,7 +478,7 @@
 		switch {
 		case nstart == NULL:	// end of this concatenation
 			if start == NULL {	// this is the empty string
-				nop := p.re.Add(new(Nop));
+				nop := p.re.Add(new(*Nop));
 				return nop, nop;
 			}
 			return;
@@ -501,11 +501,11 @@
 		case '|':
 			p.nextc();
 			nstart, nend := p.Concatenation();
-			alt := new(Alt);
+			alt := new(*Alt);
 			p.re.Add(alt);
 			alt.left = start;
 			alt.next = nstart;
-			nop := new(Nop);
+			nop := new(*Nop);
 			p.re.Add(nop);
 			end.SetNext(nop);
 			nend.SetNext(nop);
@@ -550,12 +550,12 @@
 
 func (re *RE) DoParse() {
 	parser := NewParser(re);
-	start := new(Start);
+	start := new(*Start);
 	re.Add(start);
 	s, e := parser.Regexp();
 	start.next = s;
 	re.start = start;
-	e.SetNext(re.Add(new(End)));
+	e.SetNext(re.Add(new(*End)));
 
 	if debug {
 		re.Dump();
@@ -571,8 +571,8 @@
 }
 
 
-func Compiler(str string, ch *chan *RE) {
-	re := new(RE);
+func Compiler(str string, ch chan *RE) {
+	re := new(*RE);
 	re.expr = str;
 	re.inst = array.New(0);
 	re.ch = ch;
diff --git a/src/lib/strconv/atof.go b/src/lib/strconv/atof.go
index 8869e20..b7f5156 100644
--- a/src/lib/strconv/atof.go
+++ b/src/lib/strconv/atof.go
@@ -34,7 +34,7 @@
 	}
 
 	// digits
-	b := new(Decimal);
+	b := new(*Decimal);
 	sawdot := false;
 	sawdigits := false;
 	for ; i < len(s); i++ {
diff --git a/src/lib/strconv/decimal.go b/src/lib/strconv/decimal.go
index d22d452..9f94e30 100644
--- a/src/lib/strconv/decimal.go
+++ b/src/lib/strconv/decimal.go
@@ -120,7 +120,7 @@
 }
 
 package func NewDecimal(i uint64) *Decimal {
-	a := new(Decimal);
+	a := new(*Decimal);
 	a.Assign(i);
 	return a;
 }
diff --git a/src/lib/sync/mutex_test.go b/src/lib/sync/mutex_test.go
index 7a6dd18..0fd204c 100644
--- a/src/lib/sync/mutex_test.go
+++ b/src/lib/sync/mutex_test.go
@@ -11,7 +11,7 @@
 	"testing"
 )
 
-func HammerSemaphore(s *int32, cdone *chan bool) {
+func HammerSemaphore(s *int32, cdone chan bool) {
 	for i := 0; i < 1000; i++ {
 		sys.semacquire(s);
 		sys.semrelease(s);
@@ -20,7 +20,7 @@
 }
 
 export func TestSemaphore(t *testing.T) {
-	s := new(int32);
+	s := new(*int32);
 	*s = 1;
 	c := new(chan bool);
 	for i := 0; i < 10; i++ {
@@ -32,7 +32,7 @@
 }
 
 
-func HammerMutex(m *Mutex, cdone *chan bool) {
+func HammerMutex(m *Mutex, cdone chan bool) {
 	for i := 0; i < 1000; i++ {
 		m.Lock();
 		m.Unlock();
@@ -41,7 +41,7 @@
 }
 
 export func TestMutex(t *testing.T) {
-	m := new(Mutex);
+	m := new(*Mutex);
 	c := new(chan bool);
 	for i := 0; i < 10; i++ {
 		go HammerMutex(m, c);
diff --git a/src/lib/syscall/file_linux.go b/src/lib/syscall/file_linux.go
index 4d6982b..80fc1e9 100644
--- a/src/lib/syscall/file_linux.go
+++ b/src/lib/syscall/file_linux.go
@@ -15,7 +15,7 @@
 
 export func open(name string, mode int64, perm int64) (ret int64, errno int64) {
 	var namebuf [NameBufsize]byte;
-	if !StringToBytes(&namebuf, name) {
+	if !StringToBytes(namebuf, name) {
 		return -1, ENAMETOOLONG
 	}
 	r1, r2, err := Syscall(SYS_OPEN, int64(uintptr(unsafe.pointer(&namebuf[0]))), mode, perm);
@@ -24,7 +24,7 @@
 
 export func creat(name string, perm int64) (ret int64, errno int64) {
 	var namebuf [NameBufsize]byte;
-	if !StringToBytes(&namebuf, name) {
+	if !StringToBytes(namebuf, name) {
 		return -1, ENAMETOOLONG
 	}
 	r1, r2, err := Syscall(SYS_OPEN, int64(uintptr(unsafe.pointer(&namebuf[0]))),  O_CREAT|O_WRONLY|O_TRUNC, perm);
@@ -59,7 +59,7 @@
 
 export func stat(name string, buf *Stat) (ret int64, errno int64) {
 	var namebuf [NameBufsize]byte;
-	if !StringToBytes(&namebuf, name) {
+	if !StringToBytes(namebuf, name) {
 		return -1, ENAMETOOLONG
 	}
 	r1, r2, err := Syscall(SYS_STAT, int64(uintptr(unsafe.pointer(&namebuf[0]))), int64(uintptr(unsafe.pointer(buf))), 0);
@@ -78,7 +78,7 @@
 
 export func unlink(name string) (ret int64, errno int64) {
 	var namebuf [NameBufsize]byte;
-	if !StringToBytes(&namebuf, name) {
+	if !StringToBytes(namebuf, name) {
 		return -1, ENAMETOOLONG
 	}
 	r1, r2, err := Syscall(SYS_UNLINK, int64(uintptr(unsafe.pointer(&namebuf[0]))), 0, 0);
@@ -92,7 +92,7 @@
 
 export func mkdir(name string, perm int64) (ret int64, errno int64) {
 	var namebuf [NameBufsize]byte;
-	if !StringToBytes(&namebuf, name) {
+	if !StringToBytes(namebuf, name) {
 		return -1, ENAMETOOLONG
 	}
 	r1, r2, err := Syscall(SYS_MKDIR, int64(uintptr(unsafe.pointer(&namebuf[0]))), perm, 0);
diff --git a/src/lib/tabwriter/tabwriter.go b/src/lib/tabwriter/tabwriter.go
index 16a8ae1..f8df1e1 100644
--- a/src/lib/tabwriter/tabwriter.go
+++ b/src/lib/tabwriter/tabwriter.go
@@ -165,7 +165,7 @@
 	b.lines_width.Init(0);
 	b.widths.Init(0);
 	b.AddLine();  // the very first line
-	
+
 	return b;
 }
 
@@ -219,7 +219,7 @@
 	if b.padbytes[0] == '\t' {
 		n = (n + b.cellwidth - 1) / b.cellwidth;
 	}
-	
+
 	for n > len(b.padbytes) {
 		err = b.Write0(b.padbytes);
 		if err != nil {
@@ -269,7 +269,7 @@
 				pos += s;
 			}
 		}
-		
+
 		if i+1 == b.lines_size.Len() {
 			// last buffered line - we don't have a newline, so just write
 			// any outstanding buffered data
@@ -291,22 +291,22 @@
 
 func (b *Writer) Format(pos0 int, line0, line1 int) (pos int, err *os.Error) {
 	pos = pos0;
-	column := b.widths.Len();	
+	column := b.widths.Len();
 	last := line0;
 	for this := line0; this < line1; this++ {
 		line_size, line_width := b.Line(this);
-		
+
 		if column < line_size.Len() - 1 {
 			// cell exists in this column
 			// (note that the last cell per line is ignored)
-			
+
 			// print unprinted lines until beginning of block
 			pos, err = b.WriteLines(pos, last, this);
 			if err != nil {
 				goto exit;
 			}
 			last = this;
-			
+
 			// column block begin
 			width := b.cellwidth;  // minimal width
 			for ; this < line1; this++ {
@@ -334,7 +334,7 @@
 
 	// print unprinted lines until end
 	pos, err = b.WriteLines(pos, last, line1);
-	
+
 exit:
 	return pos, err;
 }
@@ -366,7 +366,7 @@
 	}
 	return l;
 }
- 
+
 
 func (b *Writer) Append(buf []byte) {
 	b.buf.Append(buf);
@@ -438,7 +438,7 @@
 			}
 		}
 	}
-	
+
 	// append leftover text
 	b.Append(buf[i0 : n]);
 	return n, nil;
@@ -446,5 +446,5 @@
 
 
 export func New(writer io.Write, cellwidth, padding int, padchar byte, align_left, filter_html bool) *Writer {
-	return new(Writer).Init(writer, cellwidth, padding, padchar, align_left, filter_html)
+	return new(*Writer).Init(writer, cellwidth, padding, padchar, align_left, filter_html)
 }
diff --git a/src/lib/testing.go b/src/lib/testing.go
index c5a9761..3609a25 100644
--- a/src/lib/testing.go
+++ b/src/lib/testing.go
@@ -27,7 +27,7 @@
 export type T struct {
 	errors	string;
 	failed	bool;
-	ch	*chan *T;
+	ch	chan *T;
 }
 
 func (t *T) Fail() {
@@ -92,7 +92,7 @@
 		if chatty {
 			println("=== RUN ", tests[i].name);
 		}
-		t := new(T);
+		t := new(*T);
 		t.ch = new(chan *T);
 		go TRunner(t, &tests[i]);
 		<-t.ch;
diff --git a/src/lib/time/tick.go b/src/lib/time/tick.go
index f3df11c..a4cb786 100644
--- a/src/lib/time/tick.go
+++ b/src/lib/time/tick.go
@@ -18,14 +18,14 @@
 // Also, if timeouts become part of the select statement,
 // perhaps the Ticker is just:
 //
-//	func Ticker(ns int64, c *chan int64) {
+//	func Ticker(ns int64, c chan int64) {
 //		for {
 //			select { timeout ns: }
 //			nsec, err := time.Nanoseconds();
 //			c <- nsec;
 //		}
 
-func Ticker(ns int64, c *chan int64) {
+func Ticker(ns int64, c chan int64) {
 	var tv syscall.Timeval;
 	now := time.Nanoseconds();
 	when := now;
@@ -49,7 +49,7 @@
 	}
 }
 
-export func Tick(ns int64) *chan int64 {
+export func Tick(ns int64) chan int64 {
 	if ns <= 0 {
 		return nil
 	}
diff --git a/src/lib/time/time.go b/src/lib/time/time.go
index 2a6a3bf..c067cbe 100644
--- a/src/lib/time/time.go
+++ b/src/lib/time/time.go
@@ -71,7 +71,7 @@
 )
 
 export func SecondsToUTC(sec int64) *Time {
-	t := new(Time);
+	t := new(*Time);
 
 	// Split into time and day.
 	day := sec/SecondsPerDay;
diff --git a/src/lib/time/zoneinfo.go b/src/lib/time/zoneinfo.go
index 90d8adb..9ac9807 100644
--- a/src/lib/time/zoneinfo.go
+++ b/src/lib/time/zoneinfo.go
@@ -30,13 +30,12 @@
 	error bool;
 }
 
-var NIL []byte  // TODO(rsc)
 
 func (d *Data) Read(n int) []byte {
 	if len(d.p) < n {
-		d.p = NIL;
+		d.p = nil;
 		d.error = true;
-		return NIL;
+		return nil;
 	}
 	p := d.p[0:n];
 	d.p = d.p[n:len(d.p)];
@@ -86,20 +85,19 @@
 }
 
 func ParseZoneinfo(bytes []byte) (zt []Zonetime, err *os.Error) {
-	var NIL []Zonetime;  // TODO(rsc)
 
 	data1 := Data{bytes, false};
 	data := &data1;
 
 	// 4-byte magic "TZif"
 	if magic := data.Read(4); string(magic) != "TZif" {
-		return NIL, BadZoneinfo
+		return nil, BadZoneinfo
 	}
 
 	// 1-byte version, then 15 bytes of padding
 	var p []byte;
 	if p = data.Read(16); len(p) != 16 || p[0] != 0 && p[0] != '2' {
-		return NIL, BadZoneinfo
+		return nil, BadZoneinfo
 	}
 	vers := p[0];
 
@@ -122,7 +120,7 @@
 	for i := 0; i < 6; i++ {
 		nn, ok := data.Big4();
 		if !ok {
-			return NIL, BadZoneinfo
+			return nil, BadZoneinfo
 		}
 		n[i] = int(nn);
 	}
@@ -154,7 +152,7 @@
 	isutc := data.Read(n[NUTCLocal]);
 
 	if data.error {	// ran out of data
-		return NIL, BadZoneinfo
+		return nil, BadZoneinfo
 	}
 
 	// If version == 2, the entire file repeats, this time using
@@ -169,16 +167,16 @@
 		var ok bool;
 		var n uint32;
 		if n, ok = zonedata.Big4(); !ok {
-			return NIL, BadZoneinfo
+			return nil, BadZoneinfo
 		}
 		zone[i].utcoff = int(n);
 		var b byte;
 		if b, ok = zonedata.Byte(); !ok {
-			return NIL, BadZoneinfo
+			return nil, BadZoneinfo
 		}
 		zone[i].isdst = b != 0;
 		if b, ok = zonedata.Byte(); !ok || int(b) >= len(abbrev) {
-			return NIL, BadZoneinfo
+			return nil, BadZoneinfo
 		}
 		zone[i].name = ByteString(abbrev[b:len(abbrev)])
 	}
@@ -189,11 +187,11 @@
 		var ok bool;
 		var n uint32;
 		if n, ok = txtimes.Big4(); !ok {
-			return NIL, BadZoneinfo
+			return nil, BadZoneinfo
 		}
 		zt[i].time = int32(n);
 		if int(txzones[i]) >= len(zone) {
-			return NIL, BadZoneinfo
+			return nil, BadZoneinfo
 		}
 		zt[i].zone = &zone[txzones[i]];
 		if i < len(isstd) {
@@ -207,10 +205,9 @@
 }
 
 func ReadFile(name string, max int) (p []byte, err *os.Error) {
-	var NIL []byte; // TODO(rsc)
 	fd, e := os.Open(name, os.O_RDONLY, 0);
 	if e != nil {
-		return NIL, e
+		return nil, e
 	}
 	p = new([]byte, max+1)[0:0];
 	n := 0;
@@ -218,7 +215,7 @@
 		nn, e := fd.Read(p[n:cap(p)]);
 		if e != nil {
 			fd.Close();
-			return NIL, e
+			return nil, e
 		}
 		if nn == 0 {
 			fd.Close();
@@ -227,15 +224,14 @@
 		p = p[0:n+nn]
 	}
 	fd.Close();
-	return NIL, BadZoneinfo	// too long
+	return nil, BadZoneinfo	// too long
 }
 
 
 func ReadZoneinfoFile(name string) (tx []Zonetime, err *os.Error) {
-	var NIL []Zonetime;  // TODO(rsc)
 	data, e := ReadFile(name, MaxFileSize);
 	if e != nil {
-		return NIL, e
+		return nil, e
 	}
 	tx, err = ParseZoneinfo(data);
 	return tx, err
diff --git a/src/run.bash b/src/run.bash
index 15caf72..30166f7 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -26,16 +26,15 @@
 maketest \
 	lib/fmt\
 	lib/hash\
+	lib/json\
 	lib/math\
+	lib/net\
 	lib/reflect\
 	lib/regexp\
 	lib/strconv\
 	lib/tabwriter\
 	lib/time\
 
-#	lib/json\
-#	lib/net\
-
 # all of these are subtly different
 # from what maketest does.