]> Cypherpunks repositories - gostls13.git/commitdiff
go/types: fix multiword data structure alignment on nacl
authorJosh Bleecher Snyder <josharian@gmail.com>
Sun, 7 Aug 2016 16:11:00 +0000 (09:11 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Tue, 16 Aug 2016 00:24:16 +0000 (00:24 +0000)
Fixes #16464

Change-Id: Ibf5625c1b5fa3abd18623023f18664e8f81fa45a
Reviewed-on: https://go-review.googlesource.com/26996
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/go/types/sizes.go
src/go/types/sizes_test.go

index 73d827428484ccf785267bfd9a3bce6503e43461..56dfbaccbbd7d57b1481c8cfbaba0d165e4578fb 100644 (file)
@@ -64,6 +64,15 @@ func (s *StdSizes) Alignof(T Type) int64 {
                        }
                }
                return max
+       case *Slice, *Interface:
+               // Multiword data structures are effectively structs
+               // in which each element has size WordSize.
+               return s.WordSize
+       case *Basic:
+               // Strings are like slices and interfaces.
+               if t.Info()&IsString != 0 {
+                       return s.WordSize
+               }
        }
        a := s.Sizeof(T) // may be 0
        // spec: "For a variable x of any type: unsafe.Alignof(x) is at least 1."
index e809a2b05cca1b1e9a3a2fbf9afe45c64ffa1d15..64a1d991a30322b4f312e36d292547819d16a4dc 100644 (file)
@@ -58,3 +58,26 @@ type S struct {
                t.Errorf("Sizeof(%v) with WordSize 8 = %d want 40", ts, got)
        }
 }
+
+// Issue 16464
+func TestAlignofNaclSlice(t *testing.T) {
+       const src = `
+package main
+
+var s struct {
+       x *int
+       y []byte
+}
+`
+       ts := findStructType(t, src)
+       sizes := &types.StdSizes{WordSize: 4, MaxAlign: 8}
+       var fields []*types.Var
+       // Make a copy manually :(
+       for i := 0; i < ts.NumFields(); i++ {
+               fields = append(fields, ts.Field(i))
+       }
+       offsets := sizes.Offsetsof(fields)
+       if offsets[0] != 0 || offsets[1] != 4 {
+               t.Errorf("OffsetsOf(%v) = %v want %v", ts, offsets, []int{0, 4})
+       }
+}