diff options
author | Russ Cox <rsc@golang.org> | 2014-05-12 23:48:20 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-05-12 23:48:20 -0400 |
commit | 0184e13ac6c2e414821e24bfdc191ea6f25974ad (patch) | |
tree | f718c6417f7156b12d5c31edb0d0efeaebc027cf /misc/cgo | |
parent | 79aad3273cccf7e15e4a133069988e3b3a546d74 (diff) | |
download | go-0184e13ac6c2e414821e24bfdc191ea6f25974ad.tar.gz |
cmd/cgo: omit misaligned struct fields, like we omit bitfields
Fixes issue 7560.
LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://codereview.appspot.com/96300045
Diffstat (limited to 'misc/cgo')
-rw-r--r-- | misc/cgo/test/cgo_test.go | 1 | ||||
-rw-r--r-- | misc/cgo/test/issue7560.go | 44 |
2 files changed, 45 insertions, 0 deletions
diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go index f015ec9fa..eb237725a 100644 --- a/misc/cgo/test/cgo_test.go +++ b/misc/cgo/test/cgo_test.go @@ -52,5 +52,6 @@ func Test6390(t *testing.T) { test6390(t) } func Test5986(t *testing.T) { test5986(t) } func Test7665(t *testing.T) { test7665(t) } func TestNaming(t *testing.T) { testNaming(t) } +func Test7560(t *testing.T) { test7560(t) } func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) } diff --git a/misc/cgo/test/issue7560.go b/misc/cgo/test/issue7560.go new file mode 100644 index 000000000..4bea6e357 --- /dev/null +++ b/misc/cgo/test/issue7560.go @@ -0,0 +1,44 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cgotest + +/* +#include <stdint.h> + +typedef struct { + char x; + long y; +} __attribute__((__packed__)) misaligned; + +int +offset7560(void) +{ + return (uintptr_t)&((misaligned*)0)->y; +} +*/ +import "C" + +import ( + "reflect" + "testing" +) + +func test7560(t *testing.T) { + // some mingw don't implement __packed__ correctly. + if C.offset7560() != 1 { + t.Skip("C compiler did not pack struct") + } + + // C.misaligned should have x but then a padding field to get to the end of the struct. + // There should not be a field named 'y'. + var v C.misaligned + rt := reflect.TypeOf(&v).Elem() + if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" { + t.Errorf("unexpected fields in C.misaligned:\n") + for i := 0; i < rt.NumField(); i++ { + t.Logf("%+v\n", rt.Field(i)) + } + } +} |