gob: generate a better error message in one confusing place
(with maybe more to come) by printing a human-readable
representation of a remote type.

R=rsc
CC=golang-dev
https://golang.org/cl/3802045
diff --git a/src/pkg/gob/decode.go b/src/pkg/gob/decode.go
index 5a19b78..5791f62 100644
--- a/src/pkg/gob/decode.go
+++ b/src/pkg/gob/decode.go
@@ -861,12 +861,22 @@
 	return true
 }
 
+// typeString returns a human-readable description of the type identified by remoteId.
+func (dec *Decoder) typeString(remoteId typeId) string {
+	if t := idToType[remoteId]; t != nil {
+		// globally known type.
+		return t.string()
+	}
+	return dec.wireType[remoteId].string()
+}
+
+
 func (dec *Decoder) compileSingle(remoteId typeId, rt reflect.Type) (engine *decEngine, err os.Error) {
 	engine = new(decEngine)
 	engine.instr = make([]decInstr, 1) // one item
 	name := rt.String()                // best we can do
 	if !dec.compatibleType(rt, remoteId) {
-		return nil, os.ErrorString("gob: wrong type received for local value " + name)
+		return nil, os.ErrorString("gob: wrong type received for local value " + name + ": " + dec.typeString(remoteId))
 	}
 	op, indir := dec.decOpFor(remoteId, rt, name)
 	ovfl := os.ErrorString(`value for "` + name + `" out of range`)
diff --git a/src/pkg/gob/type.go b/src/pkg/gob/type.go
index 1c2b202..2ca96ce 100644
--- a/src/pkg/gob/type.go
+++ b/src/pkg/gob/type.go
@@ -392,11 +392,22 @@
 	mapT    *mapType
 }
 
-func (w *wireType) name() string {
-	if w.structT != nil {
-		return w.structT.name
+func (w *wireType) string() string {
+	const unknown = "unknown type"
+	if w == nil {
+		return unknown
 	}
-	return "unknown"
+	switch {
+	case w.arrayT != nil:
+		return w.arrayT.name
+	case w.sliceT != nil:
+		return w.sliceT.name
+	case w.structT != nil:
+		return w.structT.name
+	case w.mapT != nil:
+		return w.mapT.name
+	}
+	return unknown
 }
 
 type typeInfo struct {