aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-12-13 13:20:04 -0500
committerRuss Cox <rsc@golang.org>2010-12-13 13:20:04 -0500
commit9da73612edc47aa10856e8e21a883f17523ee17b (patch)
tree6ccc83deca0c9c7e6aa416d9da68763a3af642a8
parente7a0f6760377c6a4ad7f37ade8eabf2fdf150e0a (diff)
downloadgo-9da73612edc47aa10856e8e21a883f17523ee17b.tar.gz
go-9da73612edc47aa10856e8e21a883f17523ee17b.zip
cgo: do not reset tag generator between files
Clean up an error message and error exit too. Insert blank line after "DO NOT EDIT" comment to keep it from being a doc comment. Fixes #1213. Fixes #1222. R=r CC=golang-dev https://golang.org/cl/3608042
-rw-r--r--misc/cgo/stdio/Makefile1
-rw-r--r--misc/cgo/stdio/test.go33
-rw-r--r--misc/cgo/stdio/test1.go29
-rw-r--r--src/cmd/cgo/gcc.go8
-rw-r--r--src/cmd/cgo/main.go3
-rw-r--r--src/cmd/cgo/out.go6
6 files changed, 72 insertions, 8 deletions
diff --git a/misc/cgo/stdio/Makefile b/misc/cgo/stdio/Makefile
index ba49d9402a..fc925e607b 100644
--- a/misc/cgo/stdio/Makefile
+++ b/misc/cgo/stdio/Makefile
@@ -9,6 +9,7 @@ CGOFILES=\
align.go\
file.go\
test.go\
+ test1.go\
CLEANFILES+=hello fib chain run.out
diff --git a/misc/cgo/stdio/test.go b/misc/cgo/stdio/test.go
index 639d77b854..8f21603ca3 100644
--- a/misc/cgo/stdio/test.go
+++ b/misc/cgo/stdio/test.go
@@ -15,7 +15,7 @@ package stdio
#define SHIFT(x, y) ((x)<<(y))
#define KILO SHIFT(1, 10)
-enum {
+enum E {
Enum1 = 1,
Enum2 = 2,
};
@@ -26,6 +26,28 @@ void uuid_generate(uuid_t x) {
x[0] = 0;
}
+struct S {
+ int x;
+};
+
+extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
+
+enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
+
+// issue 1222
+typedef union {
+ long align;
+} xxpthread_mutex_t;
+
+struct ibv_async_event {
+ union {
+ int x;
+ } element;
+};
+
+struct ibv_context {
+ xxpthread_mutex_t mutex;
+};
*/
import "C"
import (
@@ -67,6 +89,10 @@ func Atol(s string) int {
return int(n)
}
+func TestConst() {
+ C.myConstFunc(nil, 0, nil)
+}
+
func TestEnum() {
if C.Enum1 != 1 || C.Enum2 != 2 {
println("bad enum", C.Enum1, C.Enum2)
@@ -105,9 +131,14 @@ var (
char C.char
)
+type Context struct {
+ ctx *C.struct_ibv_context
+}
+
func Test() {
TestAlign()
TestAtol()
TestEnum()
TestErrno()
+ TestConst()
}
diff --git a/misc/cgo/stdio/test1.go b/misc/cgo/stdio/test1.go
new file mode 100644
index 0000000000..dce2ef83c5
--- /dev/null
+++ b/misc/cgo/stdio/test1.go
@@ -0,0 +1,29 @@
+// Copyright 2010 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.
+
+// This file contains test cases for cgo.
+
+package stdio
+
+/*
+// issue 1222
+typedef union {
+ long align;
+} xxpthread_mutex_t;
+
+struct ibv_async_event {
+ union {
+ int x;
+ } element;
+};
+
+struct ibv_context {
+ xxpthread_mutex_t mutex;
+};
+*/
+import "C"
+
+type AsyncEvent struct {
+ event C.struct_ibv_async_event
+}
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index f10229d46a..6fad336354 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -593,10 +593,10 @@ type typeConv struct {
string ast.Expr
ptrSize int64
-
- tagGen int
}
+var tagGen int
+
func (c *typeConv) Init(ptrSize int64) {
c.ptrSize = ptrSize
c.m = make(map[dwarf.Type]*Type)
@@ -799,8 +799,8 @@ func (c *typeConv) Type(dtype dwarf.Type) *Type {
// Have to give it a name to simulate C "struct foo" references.
tag := dt.StructName
if tag == "" {
- tag = "__" + strconv.Itoa(c.tagGen)
- c.tagGen++
+ tag = "__" + strconv.Itoa(tagGen)
+ tagGen++
} else if t.C == "" {
t.C = dt.Kind + " " + tag
}
diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go
index cbc9d16da5..c50ecfb059 100644
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -219,6 +219,9 @@ func main() {
}
p.writeDefs()
+ if nerrors > 0 {
+ os.Exit(2)
+ }
}
// Record what needs to be recorded about f.
diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go
index d6b25d5c19..8926cb22cc 100644
--- a/src/cmd/cgo/out.go
+++ b/src/cmd/cgo/out.go
@@ -34,7 +34,7 @@ func (p *Package) writeDefs() {
// Write second Go output: definitions of _C_xxx.
// In a separate file so that the import of "unsafe" does not
// pollute the original file.
- fmt.Fprintf(fgo2, "// Created by cgo - DO NOT EDIT\n")
+ fmt.Fprintf(fgo2, "// Created by cgo - DO NOT EDIT\n\n")
fmt.Fprintf(fgo2, "package %s\n\n", p.PackageName)
fmt.Fprintf(fgo2, "import \"unsafe\"\n\n")
fmt.Fprintf(fgo2, "import \"os\"\n\n")
@@ -259,7 +259,7 @@ func (p *Package) writeOutput(f *File, srcfile string) {
p.GccFiles = append(p.GccFiles, base+".cgo2.c")
// Write Go output: Go input with rewrites of C.xxx to _C_xxx.
- fmt.Fprintf(fgo1, "// Created by cgo - DO NOT EDIT\n")
+ fmt.Fprintf(fgo1, "// Created by cgo - DO NOT EDIT\n\n")
fmt.Fprintf(fgo1, "//line %s:1\n", srcfile)
printer.Fprint(fgo1, fset, f.AST)
@@ -602,7 +602,7 @@ func (p *Package) cgoType(e ast.Expr) *Type {
return r
}
}
- error(e.Pos(), "unrecognized Go type %v", e)
+ error(e.Pos(), "unrecognized Go type %T", e)
return &Type{Size: 4, Align: 4, C: "int"}
}