reflect: fix StructOf hash and string

Adjust the hash and string fields computed by StructOf to match the
values that the compiler computes for a struct type with the same
field names and types.  This makes the reflect code match the
compiler's Type::hash_for_method and Type::reflection methods.

Fixes golang/go#25284

Change-Id: I4431709cf633bd3a500c789888bac1bd0e5426ed
Reviewed-on: https://go-review.googlesource.com/116515
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/libgo/go/reflect/all_test.go b/libgo/go/reflect/all_test.go
index 3378640..96b57ef 100644
--- a/libgo/go/reflect/all_test.go
+++ b/libgo/go/reflect/all_test.go
@@ -4411,6 +4411,17 @@
 	})
 	// check that type already in binary is found
 	checkSameType(t, StructOf(fields[2:3]), struct{ Y uint64 }{})
+
+	// gccgo used to fail this test.
+	type structFieldType interface{}
+	checkSameType(t,
+		StructOf([]StructField{
+			StructField{
+				Name: "F",
+				Type: TypeOf((*structFieldType)(nil)).Elem(),
+			},
+		}),
+		struct{ F structFieldType }{})
 }
 
 func TestStructOfExportRules(t *testing.T) {
diff --git a/libgo/go/reflect/type.go b/libgo/go/reflect/type.go
index 458c456..07fe4d0 100644
--- a/libgo/go/reflect/type.go
+++ b/libgo/go/reflect/type.go
@@ -1912,7 +1912,7 @@
 // This limitation may be lifted in a future version.
 func StructOf(fields []StructField) Type {
 	var (
-		hash       = uint32(0)
+		hash       = uint32(12)
 		size       uintptr
 		typalign   int8
 		comparable = true
@@ -1997,7 +1997,7 @@
 		}
 		fset[name] = struct{}{}
 
-		repr = append(repr, (" " + ft.String())...)
+		repr = append(repr, (" " + *ft.string)...)
 		if f.tag != nil {
 			repr = append(repr, (" " + strconv.Quote(*f.tag))...)
 		}