]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: for typedef of untagged struct, use typedef name in C code
authorIan Lance Taylor <iant@golang.org>
Thu, 5 Jun 2014 17:42:03 +0000 (10:42 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 5 Jun 2014 17:42:03 +0000 (10:42 -0700)
Fixes #8148.

LGTM=cookieo9, rsc
R=rsc, cookieo9
CC=golang-codereviews
https://golang.org/cl/103080043

misc/cgo/test/issue8148.go [new file with mode: 0644]
src/cmd/cgo/gcc.go

diff --git a/misc/cgo/test/issue8148.go b/misc/cgo/test/issue8148.go
new file mode 100644 (file)
index 0000000..8e41908
--- /dev/null
@@ -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())
+}
index 0160b4b9005e0a553fa50f768aa61394c938c996..7a802102d946f279f5f6d6f3a1021d8c05a679ae 100644 (file)
@@ -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.