summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2014-10-16 13:58:32 -0700
committerDamien Neil <dneil@google.com>2014-10-16 13:58:32 -0700
commit85be409e70fc768ab59bae5f0ee458f691c623a3 (patch)
treee9134142343f0162284e62c5c4d82783aed42015 /src/reflect
parent05958765ea86211c38f5425fda08ed3e91b040d4 (diff)
downloadgo-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/reflect')
-rw-r--r--src/reflect/all_test.go20
-rw-r--r--src/reflect/type.go1
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))
}
}