x/debug/dwarf: don't panic on unsupported type tags

Invoking Data.Type on an offset that doesn't correspond to a known type
tag should not result in a panic. Ensure that a type tag was matched and
exit early if not.

Change-Id: I1d490e2e131b5376b3ecedba8d871b513736ad66
Reviewed-on: https://go-review.googlesource.com/61070
Reviewed-by: John Dethridge <jcd@golang.org>
diff --git a/dwarf/type.go b/dwarf/type.go
index e501a42..04bbdad 100644
--- a/dwarf/type.go
+++ b/dwarf/type.go
@@ -815,6 +815,9 @@
 		typ = t
 		typeCache[off] = t
 		t.Name, _ = e.Val(AttrName).(string)
+
+	default:
+		err = DecodeError{name, off, "unsupported type tag"}
 	}
 
 	if err != nil {
diff --git a/dwarf/type_test.go b/dwarf/type_test.go
index 99392ce..aeb954c 100644
--- a/dwarf/type_test.go
+++ b/dwarf/type_test.go
@@ -121,3 +121,18 @@
 		}
 	}
 }
+
+func TestTypeForNonTypeEntry(t *testing.T) {
+	d := elfData(t, "testdata/typedef.elf")
+
+	// The returned entry will be a Subprogram.
+	ent, err := d.LookupFunction("main")
+	if err != nil {
+		t.Fatal("d.LookupFunction:", err)
+	}
+
+	_, err = d.Type(ent.Offset)
+	if err == nil {
+		t.Fatal("nil error for unreadable entry")
+	}
+}