diff options
author | Damien Neil <dneil@google.com> | 2014-10-16 13:58:32 -0700 |
---|---|---|
committer | Damien Neil <dneil@google.com> | 2014-10-16 13:58:32 -0700 |
commit | 85be409e70fc768ab59bae5f0ee458f691c623a3 (patch) | |
tree | e9134142343f0162284e62c5c4d82783aed42015 /src | |
parent | 05958765ea86211c38f5425fda08ed3e91b040d4 (diff) | |
download | go-85be409e70fc768ab59bae5f0ee458f691c623a3.tar.gz |
reflect: fix struct size calculation to include terminal padding
LGTM=r
R=r
CC=golang-codereviews
https://codereview.appspot.com/160920045
Committer: Rob Pike <r@golang.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/reflect/all_test.go | 20 | ||||
-rw-r--r-- | src/reflect/type.go | 1 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 6bdc9be9d..40eae0364 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -2678,6 +2678,26 @@ func TestFuncArg(t *testing.T) { } } +func TestStructArg(t *testing.T) { + type padded struct { + B string + C int32 + } + var ( + gotA padded + gotB uint32 + wantA = padded{"3", 4} + wantB = uint32(5) + ) + f := func(a padded, b uint32) { + gotA, gotB = a, b + } + ValueOf(f).Call([]Value{ValueOf(wantA), ValueOf(wantB)}) + if gotA != wantA || gotB != wantB { + t.Errorf("function called with (%v, %v), want (%v, %v)", gotA, gotB, wantA, wantB) + } +} + var tagGetTests = []struct { Tag StructTag Key string diff --git a/src/reflect/type.go b/src/reflect/type.go index b92d524c3..4ba1d4fcc 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -1544,6 +1544,7 @@ func (gc *gcProg) appendProg(t *rtype) { for i := 0; i < c; i++ { gc.appendProg(t.Field(i).Type.common()) } + gc.align(uintptr(t.align)) } } |