reflect: fix StructOf hash and string
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 6 Jun 2018 14:50:16 +0000 (14:50 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 6 Jun 2018 14:50:16 +0000 (14:50 +0000)
    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

    Reviewed-on: https://go-review.googlesource.com/116515

From-SVN: r261235

gcc/go/gofrontend/MERGE
libgo/go/reflect/all_test.go
libgo/go/reflect/type.go

index d2fde0778514586e8ec01f8ba1d6cff3750f1005..eba9bd41c85beabae779356da50b8b4dba26899c 100644 (file)
@@ -1,4 +1,4 @@
-8b6c7f3f9762366bab96ea95b966e93e2593be13
+baf289294a026ddd30c9e4341aff528084337763
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 3378640e7e93ac71fc6b407ed0647640bd96a1e5..96b57ef2cdaa375d4a9446f03f296ba573a85166 100644 (file)
@@ -4411,6 +4411,17 @@ func TestStructOf(t *testing.T) {
        })
        // 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) {
index 458c45638f864e30d825076cab4c298c9726c473..07fe4d001c0e5a1a32c0ab083927fbb1a53eb567 100644 (file)
@@ -1912,7 +1912,7 @@ func isValidFieldName(fieldName string) bool {
 // 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 @@ func StructOf(fields []StructField) Type {
                }
                fset[name] = struct{}{}
 
-               repr = append(repr, (" " + ft.String())...)
+               repr = append(repr, (" " + *ft.string)...)
                if f.tag != nil {
                        repr = append(repr, (" " + strconv.Quote(*f.tag))...)
                }