]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: treat simple C typedefs as go aliases
authorAnthony Sottile <asottile@umich.edu>
Sun, 10 Sep 2017 04:38:51 +0000 (21:38 -0700)
committerIan Lance Taylor <iant@golang.org>
Mon, 11 Sep 2017 06:24:15 +0000 (06:24 +0000)
Fixes #21809

Change-Id: Ic43077c6bea3c7cdc9611e74abf07b6deab70433
Reviewed-on: https://go-review.googlesource.com/62670
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
misc/cgo/test/cgo_test.go
misc/cgo/test/issue21809.go [new file with mode: 0644]
src/cmd/cgo/out.go

index f6cf86befc1408f2ae36900f685334a460b8aff6..4d1bc378dcaa9042faacc59911e9bad901a822a9 100644 (file)
@@ -82,5 +82,6 @@ func Test20266(t *testing.T)                 { test20266(t) }
 func Test20129(t *testing.T)                 { test20129(t) }
 func Test20910(t *testing.T)                 { test20910(t) }
 func Test21708(t *testing.T)                 { test21708(t) }
+func Test21809(t *testing.T)                 { test21809(t) }
 
 func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
diff --git a/misc/cgo/test/issue21809.go b/misc/cgo/test/issue21809.go
new file mode 100644 (file)
index 0000000..fd01dd7
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright 2017 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
+
+// Issue 21809.  Compile C `typedef` to go type aliases.
+
+// typedef long MySigned_t;
+// /* tests alias-to-alias */
+// typedef MySigned_t MySigned2_t;
+//
+// long takes_long(long x) { return x * x; }
+// MySigned_t takes_typedef(MySigned_t x) { return x * x; }
+import "C"
+
+import "testing"
+
+func test21809(t *testing.T) {
+    longVar := C.long(3)
+    typedefVar := C.MySigned_t(4)
+    typedefTypedefVar := C.MySigned2_t(5)
+
+    // all three should be considered identical to `long`
+    if ret := C.takes_long(longVar); ret != 9 {
+        t.Errorf("got %v but expected %v", ret, 9)
+    }
+    if ret := C.takes_long(typedefVar); ret != 16 {
+        t.Errorf("got %v but expected %v", ret, 16)
+    }
+    if ret := C.takes_long(typedefTypedefVar); ret != 25 {
+        t.Errorf("got %v but expected %v", ret, 25)
+    }
+
+    // They should also be identical to the typedef'd type
+    if ret := C.takes_typedef(longVar); ret != 9 {
+        t.Errorf("got %v but expected %v", ret, 9)
+    }
+    if ret := C.takes_typedef(typedefVar); ret != 16 {
+        t.Errorf("got %v but expected %v", ret, 16)
+    }
+    if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
+        t.Errorf("got %v but expected %v", ret, 25)
+    }
+}
index edbfc35b1deca5506f0547989d86a97c05ca2790..6df400d96cb8457d29e7f8f8c63e69c51e32a88d 100644 (file)
@@ -110,7 +110,13 @@ func (p *Package) writeDefs() {
                // Which is not useful. Moreover we never override source info,
                // so subsequent source code uses the same source info.
                // Moreover, empty file name makes compile emit no source debug info at all.
-               noSourceConf.Fprint(fgo2, fset, def.Go)
+               var buf bytes.Buffer
+               noSourceConf.Fprint(&buf, fset, def.Go)
+               if bytes.HasPrefix(buf.Bytes(), []byte("_Ctype_")) {
+                       // This typedef is of the form `typedef a b` and should be an alias.
+                       fmt.Fprintf(fgo2, "= ")
+               }
+               fmt.Fprintf(fgo2, "%s", buf.Bytes())
                fmt.Fprintf(fgo2, "\n\n")
        }
        if *gccgo {