]> Cypherpunks repositories - gostls13.git/commitdiff
cgo: do not reset tag generator between files
authorRuss Cox <rsc@golang.org>
Mon, 13 Dec 2010 18:20:04 +0000 (13:20 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 13 Dec 2010 18:20:04 +0000 (13:20 -0500)
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

misc/cgo/stdio/Makefile
misc/cgo/stdio/test.go
misc/cgo/stdio/test1.go [new file with mode: 0644]
src/cmd/cgo/gcc.go
src/cmd/cgo/main.go
src/cmd/cgo/out.go

index ba49d9402aeef38de0f605e02efda95a329e3a6c..fc925e607b40838fd6cb9c7b2fda44066c1aedf2 100644 (file)
@@ -9,6 +9,7 @@ CGOFILES=\
        align.go\
        file.go\
        test.go\
+       test1.go\
 
 CLEANFILES+=hello fib chain run.out
 
index 639d77b8546a602d4654fdf25c2194101ffd9a6a..8f21603ca32e0f3838105a847e3158ca297b3729 100644 (file)
@@ -15,7 +15,7 @@ package stdio
 #define SHIFT(x, y)  ((x)<<(y))
 #define KILO SHIFT(1, 10)
 
-enum {
+enum {
        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 (file)
index 0000000..dce2ef8
--- /dev/null
@@ -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
+}
index f10229d46a015775947ea1e47013966fee62e367..6fad3363540eaa2272a62e9533bc121c4f76f47a 100644 (file)
@@ -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
                }
index cbc9d16da585fb23b28ad8d6be994848f71a4cd6..c50ecfb059c9e4e8d2e311929149a861ed51f2a4 100644 (file)
@@ -219,6 +219,9 @@ func main() {
        }
 
        p.writeDefs()
+       if nerrors > 0 {
+               os.Exit(2)
+       }
 }
 
 // Record what needs to be recorded about f.
index d6b25d5c193421d4b95b4acf5ba1f91db013aee7..8926cb22cc3acaf10ef6ba4942f900004ae6c780 100644 (file)
@@ -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"}
 }