1
0
mirror of https://github.com/golang/go synced 2024-11-21 19:14:44 -07:00

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
This commit is contained in:
Russ Cox 2010-12-13 13:20:04 -05:00
parent e7a0f67603
commit 9da73612ed
6 changed files with 72 additions and 8 deletions

View File

@ -9,6 +9,7 @@ CGOFILES=\
align.go\ align.go\
file.go\ file.go\
test.go\ test.go\
test1.go\
CLEANFILES+=hello fib chain run.out CLEANFILES+=hello fib chain run.out

View File

@ -15,7 +15,7 @@ package stdio
#define SHIFT(x, y) ((x)<<(y)) #define SHIFT(x, y) ((x)<<(y))
#define KILO SHIFT(1, 10) #define KILO SHIFT(1, 10)
enum { enum E {
Enum1 = 1, Enum1 = 1,
Enum2 = 2, Enum2 = 2,
}; };
@ -26,6 +26,28 @@ void uuid_generate(uuid_t x) {
x[0] = 0; 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 "C"
import ( import (
@ -67,6 +89,10 @@ func Atol(s string) int {
return int(n) return int(n)
} }
func TestConst() {
C.myConstFunc(nil, 0, nil)
}
func TestEnum() { func TestEnum() {
if C.Enum1 != 1 || C.Enum2 != 2 { if C.Enum1 != 1 || C.Enum2 != 2 {
println("bad enum", C.Enum1, C.Enum2) println("bad enum", C.Enum1, C.Enum2)
@ -105,9 +131,14 @@ var (
char C.char char C.char
) )
type Context struct {
ctx *C.struct_ibv_context
}
func Test() { func Test() {
TestAlign() TestAlign()
TestAtol() TestAtol()
TestEnum() TestEnum()
TestErrno() TestErrno()
TestConst()
} }

29
misc/cgo/stdio/test1.go Normal file
View File

@ -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
}

View File

@ -593,10 +593,10 @@ type typeConv struct {
string ast.Expr string ast.Expr
ptrSize int64 ptrSize int64
tagGen int
} }
var tagGen int
func (c *typeConv) Init(ptrSize int64) { func (c *typeConv) Init(ptrSize int64) {
c.ptrSize = ptrSize c.ptrSize = ptrSize
c.m = make(map[dwarf.Type]*Type) 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. // Have to give it a name to simulate C "struct foo" references.
tag := dt.StructName tag := dt.StructName
if tag == "" { if tag == "" {
tag = "__" + strconv.Itoa(c.tagGen) tag = "__" + strconv.Itoa(tagGen)
c.tagGen++ tagGen++
} else if t.C == "" { } else if t.C == "" {
t.C = dt.Kind + " " + tag t.C = dt.Kind + " " + tag
} }

View File

@ -219,6 +219,9 @@ func main() {
} }
p.writeDefs() p.writeDefs()
if nerrors > 0 {
os.Exit(2)
}
} }
// Record what needs to be recorded about f. // Record what needs to be recorded about f.

View File

@ -34,7 +34,7 @@ func (p *Package) writeDefs() {
// Write second Go output: definitions of _C_xxx. // Write second Go output: definitions of _C_xxx.
// In a separate file so that the import of "unsafe" does not // In a separate file so that the import of "unsafe" does not
// pollute the original file. // 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, "package %s\n\n", p.PackageName)
fmt.Fprintf(fgo2, "import \"unsafe\"\n\n") fmt.Fprintf(fgo2, "import \"unsafe\"\n\n")
fmt.Fprintf(fgo2, "import \"os\"\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") p.GccFiles = append(p.GccFiles, base+".cgo2.c")
// Write Go output: Go input with rewrites of C.xxx to _C_xxx. // 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) fmt.Fprintf(fgo1, "//line %s:1\n", srcfile)
printer.Fprint(fgo1, fset, f.AST) printer.Fprint(fgo1, fset, f.AST)
@ -602,7 +602,7 @@ func (p *Package) cgoType(e ast.Expr) *Type {
return r 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"} return &Type{Size: 4, Align: 4, C: "int"}
} }