diff options
author | Russ Cox <rsc@golang.org> | 2014-06-06 22:06:57 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-06-06 22:06:57 -0400 |
commit | dd58096ae60e55bf064f10b5ff0f7fd92e5b1251 (patch) | |
tree | 86c6cda648446ce35dc9a843e5e57ecdf5357766 | |
parent | e1e3e705a634ea1877a6458e3e0d418fe38ed3ca (diff) | |
download | go-dd58096ae60e55bf064f10b5ff0f7fd92e5b1251.tar.gz go-dd58096ae60e55bf064f10b5ff0f7fd92e5b1251.zip |
[release-branch.go1.3] cmd/cgo: for typedef of untagged struct, use typedef name in C code
««« CL 103080043 / 5e058e21b67d
cmd/cgo: for typedef of untagged struct, use typedef name in C code
Fixes #8148.
LGTM=cookieo9, rsc
R=rsc, cookieo9
CC=golang-codereviews
https://golang.org/cl/103080043
»»»
LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews, r
https://golang.org/cl/103900046
-rw-r--r-- | misc/cgo/test/issue8148.go | 31 | ||||
-rw-r--r-- | src/cmd/cgo/gcc.go | 5 |
2 files changed, 36 insertions, 0 deletions
diff --git a/misc/cgo/test/issue8148.go b/misc/cgo/test/issue8148.go new file mode 100644 index 0000000000..8e41908489 --- /dev/null +++ b/misc/cgo/test/issue8148.go @@ -0,0 +1,31 @@ +// 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. + +// Issue 8148. A typedef of an unnamed struct didn't work when used +// with an exported Go function. No runtime test; just make sure it +// compiles. + +package cgotest + +/* +typedef struct { int i; } T; + +int issue8148Callback(T*); + +static int get() { + T t; + t.i = 42; + return issue8148Callback(&t); +} +*/ +import "C" + +//export issue8148Callback +func issue8148Callback(t *C.T) C.int { + return t.i +} + +func Issue8148() int { + return int(C.get()) +} diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 0160b4b900..7a802102d9 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -1283,6 +1283,11 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { if isStructUnionClass(sub.Go) || *godefs || *cdefs { t.Go = sub.Go + if isStructUnionClass(sub.Go) { + // Use the typedef name for C code. + typedef[sub.Go.(*ast.Ident).Name].C = t.C + } + // If we've seen this typedef before, and it // was an anonymous struct/union/class before // too, use the old definition. |