// Copyright 2013 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. package main /* #include typedef struct foo foo_t; typedef struct bar bar_t; foo_t *foop; long double x = 0; static int transform(int x) { return x; } typedef void v; void F(v** p) {} void fvi(void *p, int x) {} void fppi(int** p) {} int i; void fi(int i) {} */ import "C" import ( "unsafe" ) func main() { s := "" _ = s C.malloc(s) // ERROR HERE x := (*C.bar_t)(nil) C.foop = x // ERROR HERE // issue 13129: used to output error about C.unsignedshort with CC=clang var x1 C.ushort x1 = int(0) // ERROR HERE: C\.ushort // issue 13423 _ = C.fopen() // ERROR HERE // issue 13467 var x2 rune = '✈' var _ rune = C.transform(x2) // ERROR HERE: C\.int // issue 13635: used to output error about C.unsignedchar. // This test tests all such types. var ( _ C.uchar = "uc" // ERROR HERE: C\.uchar _ C.schar = "sc" // ERROR HERE: C\.schar _ C.ushort = "us" // ERROR HERE: C\.ushort _ C.uint = "ui" // ERROR HERE: C\.uint _ C.ulong = "ul" // ERROR HERE: C\.ulong _ C.longlong = "ll" // ERROR HERE: C\.longlong _ C.ulonglong = "ull" // ERROR HERE: C\.ulonglong _ C.complexfloat = "cf" // ERROR HERE: C\.complexfloat _ C.complexdouble = "cd" // ERROR HERE: C\.complexdouble ) // issue 13830 // cgo converts C void* to Go unsafe.Pointer, so despite appearances C // void** is Go *unsafe.Pointer. This test verifies that we detect the // problem at build time. { type v [0]byte f := func(p **v) { C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE } var p *v f(&p) } // issue 16116 _ = C.fvi(1) // ERROR HERE // Issue 16591: Test that we detect an invalid call that was being // hidden by a type conversion inserted by cgo checking. { type x *C.int var p *x C.fppi(p) // ERROR HERE } // issue 26745 _ = func(i int) int { // typecheck reports at column 14 ('+'), but types2 reports at // column 10 ('C'). // TODO(mdempsky): Investigate why, and see if types2 can be // updated to match typecheck behavior. return C.i + 1 // ERROR HERE: \b(10|14)\b } _ = func(i int) { // typecheck reports at column 7 ('('), but types2 reports at // column 8 ('i'). The types2 position is more correct, but // updating typecheck here is fundamentally challenging because of // IR limitations. C.fi(i) // ERROR HERE: \b(7|8)\b } C.fi = C.fi // ERROR HERE }