1
0
mirror of https://github.com/golang/go synced 2024-11-21 20:04: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\
file.go\
test.go\
test1.go\
CLEANFILES+=hello fib chain run.out

View File

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

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

View File

@ -219,6 +219,9 @@ func main() {
}
p.writeDefs()
if nerrors > 0 {
os.Exit(2)
}
}
// 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.
// 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"}
}