runtime: correct runtime structfield type to match reflect
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 6 Feb 2018 15:18:50 +0000 (15:18 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 6 Feb 2018 15:18:50 +0000 (15:18 +0000)
    The offset field in structfield has changed to offsetAnon, and now
    requires a shift to get the actual offset value.

    Fixes golang/go#23391

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

From-SVN: r257413

gcc/go/gofrontend/MERGE
libgo/go/runtime/cgocall.go
libgo/go/runtime/type.go

index ba8a8e0b48beef8917313fc13626c38e08ffc826..91bebe5d232bb74305baeb7e52310eec404e6751 100644 (file)
@@ -1,4 +1,4 @@
-c02c71187c9794b50444e2858c582e66a3442ee8
+1927b40e59e7c2067ecb03384b331d1be3cb5eea
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 9d161202dfa917edf3667cf03060c4b4502a6ef4..d5794bc3341a0fdac0e37fb524af8ce76eb78ae3 100644 (file)
@@ -189,7 +189,7 @@ func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool, msg string) {
                        return
                }
                for _, f := range st.fields {
-                       cgoCheckArg(f.typ, add(p, f.offset), true, top, msg)
+                       cgoCheckArg(f.typ, add(p, f.offset()), true, top, msg)
                }
        case kindPtr, kindUnsafePointer:
                if indir {
index 6788f2425e1323066746b0c496c50fb579f499f4..0ec0da411797189c443ec6f10afd47f97df06aeb 100644 (file)
@@ -113,11 +113,19 @@ type ptrtype struct {
 }
 
 type structfield struct {
-       name    *string // nil for embedded fields
-       pkgPath *string // nil for exported Names; otherwise import path
-       typ     *_type  // type of field
-       tag     *string // nil if no tag
-       offset  uintptr // byte offset of field within struct
+       name       *string // nil for embedded fields
+       pkgPath    *string // nil for exported Names; otherwise import path
+       typ        *_type  // type of field
+       tag        *string // nil if no tag
+       offsetAnon uintptr // byte offset of field<<1 | isAnonymous
+}
+
+func (f *structfield) offset() uintptr {
+       return f.offsetAnon >> 1
+}
+
+func (f *structfield) anon() bool {
+       return f.offsetAnon&1 != 0
 }
 
 type structtype struct {