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 The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. 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 // check that type already in binary is found
checkSameType(t, StructOf(fields[2:3]), struct{ Y uint64 }{}) 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) { 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. // This limitation may be lifted in a future version.
func StructOf(fields []StructField) Type { func StructOf(fields []StructField) Type {
var ( var (
hash = uint32(0) hash = uint32(12)
size uintptr size uintptr
typalign int8 typalign int8
comparable = true comparable = true
@ -1997,7 +1997,7 @@ func StructOf(fields []StructField) Type {
} }
fset[name] = struct{}{} fset[name] = struct{}{}
repr = append(repr, (" " + ft.String())...) repr = append(repr, (" " + *ft.string)...)
if f.tag != nil { if f.tag != nil {
repr = append(repr, (" " + strconv.Quote(*f.tag))...) repr = append(repr, (" " + strconv.Quote(*f.tag))...)
} }