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:
parent
e7a0f67603
commit
9da73612ed
@ -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
|
||||||
|
|
||||||
|
@ -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
29
misc/cgo/stdio/test1.go
Normal 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
|
||||||
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
@ -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"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user