mirror of https://github.com/golang/go.git
cmd/cgo: recognize known C typedefs as types
Fixes #14483. Change-Id: I0cddfe27fd8d00ba85659d0b618410e39ebf45cb Reviewed-on: https://go-review.googlesource.com/19860 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
922ce58de0
commit
71cc445cf9
|
|
@ -122,6 +122,16 @@ var ptrTests = []ptrTest{
|
||||||
body: `i := 0; p := &S{p:&i}; s := p.a[:]; C.f(unsafe.Pointer(&s[0]))`,
|
body: `i := 0; p := &S{p:&i}; s := p.a[:]; C.f(unsafe.Pointer(&s[0]))`,
|
||||||
fail: false,
|
fail: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// Passing the address of a slice of an array that is
|
||||||
|
// an element in a struct, with a type conversion.
|
||||||
|
name: "slice-ok-4",
|
||||||
|
c: `typedef void* PV; void f(PV p) {}`,
|
||||||
|
imports: []string{"unsafe"},
|
||||||
|
support: `type S struct { p *int; a [4]byte }`,
|
||||||
|
body: `i := 0; p := &S{p:&i}; C.f(C.PV(unsafe.Pointer(&p.a[0])))`,
|
||||||
|
fail: false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// Passing the address of a static variable with no
|
// Passing the address of a static variable with no
|
||||||
// pointers doesn't matter.
|
// pointers doesn't matter.
|
||||||
|
|
|
||||||
|
|
@ -819,14 +819,17 @@ func (p *Package) hasSideEffects(f *File, x ast.Expr) bool {
|
||||||
func (p *Package) isType(t ast.Expr) bool {
|
func (p *Package) isType(t ast.Expr) bool {
|
||||||
switch t := t.(type) {
|
switch t := t.(type) {
|
||||||
case *ast.SelectorExpr:
|
case *ast.SelectorExpr:
|
||||||
if t.Sel.Name != "Pointer" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
id, ok := t.X.(*ast.Ident)
|
id, ok := t.X.(*ast.Ident)
|
||||||
if !ok {
|
if !ok {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return id.Name == "unsafe"
|
if id.Name == "unsafe" && t.Sel.Name == "Pointer" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if id.Name == "C" && typedef["_Ctype_"+t.Sel.Name] != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
case *ast.Ident:
|
case *ast.Ident:
|
||||||
// TODO: This ignores shadowing.
|
// TODO: This ignores shadowing.
|
||||||
switch t.Name {
|
switch t.Name {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue