• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2013 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
5package main
6
7/*
8#include <stdio.h>
9
10typedef struct foo foo_t;
11typedef struct bar bar_t;
12
13foo_t *foop;
14
15long double x = 0;
16
17static int transform(int x) { return x; }
18
19typedef void v;
20void F(v** p) {}
21
22void fvi(void *p, int x) {}
23
24void fppi(int** p) {}
25
26int i;
27void fi(int i) {}
28*/
29import "C"
30import (
31	"unsafe"
32)
33
34func main() {
35	s := ""
36	_ = s
37	C.malloc(s) // ERROR HERE
38
39	x := (*C.bar_t)(nil)
40	C.foop = x // ERROR HERE
41
42	// issue 13129: used to output error about C.unsignedshort with CC=clang
43	var x1 C.ushort
44	x1 = int(0) // ERROR HERE: C\.ushort
45
46	// issue 13423
47	_ = C.fopen() // ERROR HERE
48
49	// issue 13467
50	var x2 rune = '✈'
51	var _ rune = C.transform(x2) // ERROR HERE: C\.int
52
53	// issue 13635: used to output error about C.unsignedchar.
54	// This test tests all such types.
55	var (
56		_ C.uchar         = "uc"  // ERROR HERE: C\.uchar
57		_ C.schar         = "sc"  // ERROR HERE: C\.schar
58		_ C.ushort        = "us"  // ERROR HERE: C\.ushort
59		_ C.uint          = "ui"  // ERROR HERE: C\.uint
60		_ C.ulong         = "ul"  // ERROR HERE: C\.ulong
61		_ C.longlong      = "ll"  // ERROR HERE: C\.longlong
62		_ C.ulonglong     = "ull" // ERROR HERE: C\.ulonglong
63		_ C.complexfloat  = "cf"  // ERROR HERE: C\.complexfloat
64		_ C.complexdouble = "cd"  // ERROR HERE: C\.complexdouble
65	)
66
67	// issue 13830
68	// cgo converts C void* to Go unsafe.Pointer, so despite appearances C
69	// void** is Go *unsafe.Pointer. This test verifies that we detect the
70	// problem at build time.
71	{
72		type v [0]byte
73
74		f := func(p **v) {
75			C.F((**C.v)(unsafe.Pointer(p))) // ERROR HERE
76		}
77		var p *v
78		f(&p)
79	}
80
81	// issue 16116
82	_ = C.fvi(1) // ERROR HERE
83
84	// Issue 16591: Test that we detect an invalid call that was being
85	// hidden by a type conversion inserted by cgo checking.
86	{
87		type x *C.int
88		var p *x
89		C.fppi(p) // ERROR HERE
90	}
91
92	// issue 26745
93	_ = func(i int) int {
94		// typecheck reports at column 14 ('+'), but types2 reports at
95		// column 10 ('C').
96		// TODO(mdempsky): Investigate why, and see if types2 can be
97		// updated to match typecheck behavior.
98		return C.i + 1 // ERROR HERE: \b(10|14)\b
99	}
100	_ = func(i int) {
101		// typecheck reports at column 7 ('('), but types2 reports at
102		// column 8 ('i'). The types2 position is more correct, but
103		// updating typecheck here is fundamentally challenging because of
104		// IR limitations.
105		C.fi(i) // ERROR HERE: \b(7|8)\b
106	}
107
108	C.fi = C.fi // ERROR HERE
109
110}
111