github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/analysis/passes/cgocall/testdata/src/a/cgo.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // This file contains tests for the cgo checker.
     6  
     7  package a
     8  
     9  // void f(void *ptr) {}
    10  import "C"
    11  
    12  import "unsafe"
    13  
    14  func CgoTests() {
    15  	var c chan bool
    16  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&c))) // want "embedded pointer"
    17  	C.f(unsafe.Pointer(&c))                     // want "embedded pointer"
    18  
    19  	var m map[string]string
    20  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&m))) // want "embedded pointer"
    21  	C.f(unsafe.Pointer(&m))                     // want "embedded pointer"
    22  
    23  	var f func()
    24  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&f))) // want "embedded pointer"
    25  	C.f(unsafe.Pointer(&f))                     // want "embedded pointer"
    26  
    27  	var s []int
    28  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&s))) // want "embedded pointer"
    29  	C.f(unsafe.Pointer(&s))                     // want "embedded pointer"
    30  
    31  	var a [1][]int
    32  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&a))) // want "embedded pointer"
    33  	C.f(unsafe.Pointer(&a))                     // want "embedded pointer"
    34  
    35  	var st struct{ f []int }
    36  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&st))) // want "embedded pointer"
    37  	C.f(unsafe.Pointer(&st))                     // want "embedded pointer"
    38  
    39  	var st3 S
    40  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&st3))) // want "embedded pointer"
    41  	C.f(unsafe.Pointer(&st3))                     // want "embedded pointer"
    42  
    43  	// The following cases are OK.
    44  	var i int
    45  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&i)))
    46  	C.f(unsafe.Pointer(&i))
    47  
    48  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&s[0])))
    49  	C.f(unsafe.Pointer(&s[0]))
    50  
    51  	var a2 [1]int
    52  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&a2)))
    53  	C.f(unsafe.Pointer(&a2))
    54  
    55  	var st2 struct{ i int }
    56  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&st2)))
    57  	C.f(unsafe.Pointer(&st2))
    58  
    59  	var st4 S2
    60  	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&st4)))
    61  	C.f(unsafe.Pointer(&st4))
    62  
    63  	type cgoStruct struct{ p *cgoStruct }
    64  	C.f(unsafe.Pointer(&cgoStruct{}))
    65  
    66  	C.CBytes([]byte("hello"))
    67  }
    68  
    69  type S struct{ slice []int }
    70  
    71  type S2 struct{ int int }