goprotobuf: Fix text formatting of typed nil.

R=adg
CC=golang-dev
https://codereview.appspot.com/7223057
diff --git a/proto/text.go b/proto/text.go
index fc3763e..64a4ae7 100644
--- a/proto/text.go
+++ b/proto/text.go
@@ -615,7 +615,8 @@
 }
 
 func marshalText(w io.Writer, pb Message, compact bool) error {
-	if pb == nil {
+	val := reflect.ValueOf(pb)
+	if pb == nil || val.IsNil() {
 		w.Write([]byte("<nil>"))
 		return nil
 	}
@@ -632,7 +633,7 @@
 	}
 
 	// Dereference the received pointer so we don't have outer < and >.
-	v := reflect.Indirect(reflect.ValueOf(pb))
+	v := reflect.Indirect(val)
 	if err := writeStruct(aw, v); err != nil {
 		return err
 	}
diff --git a/proto/text_test.go b/proto/text_test.go
index 69ae0cc..4904295 100644
--- a/proto/text_test.go
+++ b/proto/text_test.go
@@ -152,6 +152,20 @@
 	}
 }
 
+func TestMarshalTextNil(t *testing.T) {
+	want := "<nil>"
+	tests := []proto.Message{nil, (*pb.MyMessage)(nil)}
+	for i, test := range tests {
+		buf := new(bytes.Buffer)
+		if err := proto.MarshalText(buf, test); err != nil {
+			t.Fatal(err)
+		}
+		if got := buf.String(); got != want {
+			t.Errorf("%d: got %q want %q", i, got, want)
+		}
+	}
+}
+
 func BenchmarkMarshalTextBuffered(b *testing.B) {
 	buf := new(bytes.Buffer)
 	m := newTestMessage()