Home | History | Annotate | Download | only in cgo
      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 testdata
      8 
      9 // void f(void *);
     10 import "C"
     11 
     12 import "unsafe"
     13 
     14 func CgoTests() {
     15 	var c chan bool
     16 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&c))) // ERROR "embedded pointer"
     17 	C.f(unsafe.Pointer(&c))                     // ERROR "embedded pointer"
     18 
     19 	var m map[string]string
     20 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&m))) // ERROR "embedded pointer"
     21 	C.f(unsafe.Pointer(&m))                     // ERROR "embedded pointer"
     22 
     23 	var f func()
     24 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&f))) // ERROR "embedded pointer"
     25 	C.f(unsafe.Pointer(&f))                     // ERROR "embedded pointer"
     26 
     27 	var s []int
     28 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&s))) // ERROR "embedded pointer"
     29 	C.f(unsafe.Pointer(&s))                     // ERROR "embedded pointer"
     30 
     31 	var a [1][]int
     32 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&a))) // ERROR "embedded pointer"
     33 	C.f(unsafe.Pointer(&a))                     // ERROR "embedded pointer"
     34 
     35 	var st struct{ f []int }
     36 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&st))) // ERROR "embedded pointer"
     37 	C.f(unsafe.Pointer(&st))                     // ERROR "embedded pointer"
     38 
     39 	// The following cases are OK.
     40 	var i int
     41 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&i)))
     42 	C.f(unsafe.Pointer(&i))
     43 
     44 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&s[0])))
     45 	C.f(unsafe.Pointer(&s[0]))
     46 
     47 	var a2 [1]int
     48 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&a2)))
     49 	C.f(unsafe.Pointer(&a2))
     50 
     51 	var st2 struct{ i int }
     52 	C.f(*(*unsafe.Pointer)(unsafe.Pointer(&st2)))
     53 	C.f(unsafe.Pointer(&st2))
     54 
     55 	type cgoStruct struct{ p *cgoStruct }
     56 	C.f(unsafe.Pointer(&cgoStruct{}))
     57 
     58 	C.CBytes([]byte("hello"))
     59 }
     60