From dd58096ae60e55bf064f10b5ff0f7fd92e5b1251 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 6 Jun 2014 22:06:57 -0400 Subject: [PATCH] [release-branch.go1.3] cmd/cgo: for typedef of untagged struct, use typedef name in C code MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit ««« 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 --- misc/cgo/test/issue8148.go | 31 +++++++++++++++++++++++++++++++ src/cmd/cgo/gcc.go | 5 +++++ 2 files changed, 36 insertions(+) create mode 100644 misc/cgo/test/issue8148.go 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. -- 2.50.0