123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- // 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 <stdio.h>
- 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
- }
|