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
    
    Reviewed-on: https://go-review.googlesource.com/116515

From-SVN: r261235
This commit is contained in:
Ian Lance Taylor 2018-06-06 14:50:16 +00:00
parent 1336795a56
commit 1d6ccc5f29
3 changed files with 14 additions and 3 deletions

View 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.

View 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) {

View 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))...)
}