From e0d8064ed4b53436f678960022c7092b2078094d Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 7 Aug 2016 09:11:00 -0700 Subject: [PATCH] go/types: fix multiword data structure alignment on nacl Fixes #16464 Change-Id: Ibf5625c1b5fa3abd18623023f18664e8f81fa45a Reviewed-on: https://go-review.googlesource.com/26996 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/sizes.go | 9 +++++++++ src/go/types/sizes_test.go | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/go/types/sizes.go b/src/go/types/sizes.go index 73d8274284..56dfbaccbb 100644 --- a/src/go/types/sizes.go +++ b/src/go/types/sizes.go @@ -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." diff --git a/src/go/types/sizes_test.go b/src/go/types/sizes_test.go index e809a2b05c..64a1d991a3 100644 --- a/src/go/types/sizes_test.go +++ b/src/go/types/sizes_test.go @@ -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}) + } +} -- 2.48.1