mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
1336795a56
commit
1d6ccc5f29
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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))...)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue