1
2
3
4
5
6
7
8
9
10
11 package cgotest
12
13
1003 import "C"
1004
1005 import (
1006 "context"
1007 "crypto/subtle"
1008 "fmt"
1009 "internal/asan"
1010 "internal/runtime/sys"
1011 "math"
1012 "math/rand"
1013 "os"
1014 "os/signal"
1015 "reflect"
1016 "runtime"
1017 "runtime/cgo"
1018 "sync"
1019 "syscall"
1020 "testing"
1021 "time"
1022 "unsafe"
1023 )
1024
1025
1026
1027 func testAlign(t *testing.T) {
1028 var evt C.SDL_KeyboardEvent
1029 C.makeEvent(&evt)
1030 if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
1031 t.Error("*** bad alignment")
1032 C.cTest(&evt)
1033 t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
1034 evt.typ, evt.which, evt.state, evt.keysym.scancode,
1035 evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
1036 t.Error(evt)
1037 }
1038 }
1039
1040
1041
1042 const greeting = "hello, world"
1043
1044 type testPair struct {
1045 Name string
1046 Got, Want interface{}
1047 }
1048
1049 var testPairs = []testPair{
1050 {"GoString", C.GoString(C.greeting), greeting},
1051 {"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
1052 {"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
1053 }
1054
1055 func testHelpers(t *testing.T) {
1056 for _, pair := range testPairs {
1057 if !reflect.DeepEqual(pair.Got, pair.Want) {
1058 t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
1059 }
1060 }
1061 }
1062
1063
1064
1065 const EINVAL = C.EINVAL
1066
1067 var KILO = C.KILO
1068
1069 func uuidgen() {
1070 var uuid C.cgo_uuid_t
1071 C.uuid_generate(&uuid[0])
1072 }
1073
1074 func Strtol(s string, base int) (int, error) {
1075 p := C.CString(s)
1076 n, err := C.strtol(p, nil, C.int(base))
1077 C.free(unsafe.Pointer(p))
1078 return int(n), err
1079 }
1080
1081 func Atol(s string) int {
1082 p := C.CString(s)
1083 n := C.atol(p)
1084 C.free(unsafe.Pointer(p))
1085 return int(n)
1086 }
1087
1088 func testConst(t *testing.T) {
1089 C.myConstFunc(nil, 0, nil)
1090 }
1091
1092 func testEnum(t *testing.T) {
1093 if C.Enum1 != 1 || C.Enum2 != 2 {
1094 t.Error("bad enum", C.Enum1, C.Enum2)
1095 }
1096 }
1097
1098 func testNamedEnum(t *testing.T) {
1099 e := new(C.enum_E)
1100
1101 *e = C.Enum1
1102 if *e != 1 {
1103 t.Error("bad enum", C.Enum1)
1104 }
1105
1106 *e = C.Enum2
1107 if *e != 2 {
1108 t.Error("bad enum", C.Enum2)
1109 }
1110 }
1111
1112 func testCastToEnum(t *testing.T) {
1113 e := C.enum_E(C.Enum1)
1114 if e != 1 {
1115 t.Error("bad enum", C.Enum1)
1116 }
1117
1118 e = C.enum_E(C.Enum2)
1119 if e != 2 {
1120 t.Error("bad enum", C.Enum2)
1121 }
1122 }
1123
1124 func testAtol(t *testing.T) {
1125 l := Atol("123")
1126 if l != 123 {
1127 t.Error("Atol 123: ", l)
1128 }
1129 }
1130
1131 func testErrno(t *testing.T) {
1132 p := C.CString("no-such-file")
1133 m := C.CString("r")
1134 f, err := C.fopen(p, m)
1135 C.free(unsafe.Pointer(p))
1136 C.free(unsafe.Pointer(m))
1137 if err == nil {
1138 C.fclose(f)
1139 t.Fatalf("C.fopen: should fail")
1140 }
1141 if err != syscall.ENOENT {
1142 t.Fatalf("C.fopen: unexpected error: %v", err)
1143 }
1144 }
1145
1146 func testMultipleAssign(t *testing.T) {
1147 if runtime.GOOS == "windows" && usesUCRT(t) {
1148
1149
1150
1151 t.Skip("skipping test on Windows when linking with UCRT")
1152 }
1153 p := C.CString("234")
1154 n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
1155 defer C.free(unsafe.Pointer(p))
1156 if runtime.GOOS == "openbsd" {
1157
1158 if (n != 0 && n != 239089) || m != 234 {
1159 t.Fatal("Strtol x2: ", n, m)
1160 }
1161 } else if n != 0 || m != 234 {
1162 t.Fatal("Strtol x2: ", n, m)
1163 }
1164 }
1165
1166 var (
1167 cuint = (C.uint)(0)
1168 culong C.ulong
1169 cchar C.char
1170 )
1171
1172 type Context struct {
1173 ctx *C.struct_ibv_context
1174 }
1175
1176 func benchCgoCall(b *testing.B) {
1177 b.Run("add-int", func(b *testing.B) {
1178 const x = C.int(2)
1179 const y = C.int(3)
1180
1181 for i := 0; i < b.N; i++ {
1182 C.add(x, y)
1183 }
1184 })
1185
1186 b.Run("one-pointer", func(b *testing.B) {
1187 var a0 C.VkDeviceCreateInfo
1188 for i := 0; i < b.N; i++ {
1189 C.handleComplexPointer(&a0)
1190 }
1191 })
1192 b.Run("string-pointer-escape", func(b *testing.B) {
1193 for i := 0; i < b.N; i++ {
1194 var s string
1195 C.handleGoStringPointerEscape(unsafe.Pointer(&s))
1196 }
1197 })
1198 b.Run("string-pointer-noescape", func(b *testing.B) {
1199 for i := 0; i < b.N; i++ {
1200 var s string
1201 C.handleGoStringPointerNoescape(unsafe.Pointer(&s))
1202 }
1203 })
1204 b.Run("eight-pointers", func(b *testing.B) {
1205 var a0, a1, a2, a3, a4, a5, a6, a7 C.VkDeviceCreateInfo
1206 for i := 0; i < b.N; i++ {
1207 C.handleComplexPointer8(&a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7)
1208 }
1209 })
1210 b.Run("eight-pointers-nil", func(b *testing.B) {
1211 var a0, a1, a2, a3, a4, a5, a6, a7 *C.VkDeviceCreateInfo
1212 for i := 0; i < b.N; i++ {
1213 C.handleComplexPointer8(a0, a1, a2, a3, a4, a5, a6, a7)
1214 }
1215 })
1216 b.Run("eight-pointers-array", func(b *testing.B) {
1217 var a [8]C.VkDeviceCreateInfo
1218 for i := 0; i < b.N; i++ {
1219 C.handleComplexPointer8(&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7])
1220 }
1221 })
1222 b.Run("eight-pointers-slice", func(b *testing.B) {
1223 a := make([]C.VkDeviceCreateInfo, 8)
1224 for i := 0; i < b.N; i++ {
1225 C.handleComplexPointer8(&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7])
1226 }
1227 })
1228 }
1229
1230
1231 func benchCallback(b *testing.B) {
1232 var x = false
1233 for i := 0; i < b.N; i++ {
1234 nestedCall(func() { x = true })
1235 }
1236 if !x {
1237 b.Fatal("nestedCall was not invoked")
1238 }
1239 }
1240
1241 var sinkString string
1242
1243 func benchGoString(b *testing.B) {
1244 for i := 0; i < b.N; i++ {
1245 sinkString = C.GoString(C.cstr)
1246 }
1247 const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
1248 if sinkString != want {
1249 b.Fatalf("%q != %q", sinkString, want)
1250 }
1251 }
1252
1253
1254 func sliceOperands(array [2000]int) {
1255 _ = array[C.KILO:C.KILO:C.KILO]
1256 }
1257
1258
1259 var testThreadLockFunc = func(*testing.T) {}
1260
1261
1262
1263 func TestComplexAlign(t *testing.T) {
1264 if C.cplxAlign.x != 3.14 {
1265 t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
1266 }
1267 if C.cplxAlign.y != 2.17 {
1268 t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
1269 }
1270 }
1271
1272
1273
1274 func testCheckConst(t *testing.T) {
1275
1276 p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
1277 defer C.free(p)
1278 C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
1279 }
1280
1281
1282
1283 func duplicateSymbols() {
1284 fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
1285 }
1286
1287
1288
1289
1290 func testSetEnv(t *testing.T) {
1291 if runtime.GOOS == "windows" {
1292
1293
1294
1295
1296 t.Logf("skipping test")
1297 return
1298 }
1299 const key = "CGO_OS_TEST_KEY"
1300 const val = "CGO_OS_TEST_VALUE"
1301 os.Setenv(key, val)
1302 keyc := C.CString(key)
1303 defer C.free(unsafe.Pointer(keyc))
1304 v := C.getenv(keyc)
1305 if uintptr(unsafe.Pointer(v)) == 0 {
1306 t.Fatal("getenv returned NULL")
1307 }
1308 vs := C.GoString(v)
1309 if vs != val {
1310 t.Fatalf("getenv() = %q; want %q", vs, val)
1311 }
1312 }
1313
1314
1315
1316 func callBridge(f C.intFunc) int {
1317 return int(C.bridge_int_func(f))
1318 }
1319
1320 func callCBridge(f C.intFunc) C.int {
1321 return C.bridge_int_func(f)
1322 }
1323
1324 func testFpVar(t *testing.T) {
1325 const expected = 42
1326 f := C.intFunc(C.fortytwo)
1327 res1 := C.bridge_int_func(f)
1328 if r1 := int(res1); r1 != expected {
1329 t.Errorf("got %d, want %d", r1, expected)
1330 }
1331 res2 := callCBridge(f)
1332 if r2 := int(res2); r2 != expected {
1333 t.Errorf("got %d, want %d", r2, expected)
1334 }
1335 r3 := callBridge(f)
1336 if r3 != expected {
1337 t.Errorf("got %d, want %d", r3, expected)
1338 }
1339 }
1340
1341
1342 type AsyncEvent struct {
1343 event C.struct_ibv_async_event
1344 }
1345
1346
1347
1348 func test1635(t *testing.T) {
1349 C.scatter()
1350 if v := C.hola; v != 0 {
1351 t.Fatalf("C.hola is %d, should be 0", v)
1352 }
1353 if v := C.testHola(); v != 0 {
1354 t.Fatalf("C.testHola() is %d, should be 0", v)
1355 }
1356 }
1357
1358
1359
1360 func testUnsignedInt(t *testing.T) {
1361 a := (int64)(C.UINT32VAL)
1362 b := (int64)(0xc008427b)
1363 if a != b {
1364 t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
1365 }
1366 }
1367
1368
1369
1370 func test3250(t *testing.T) {
1371 if runtime.GOOS == "windows" {
1372 t.Skip("not applicable on windows")
1373 }
1374
1375 t.Skip("skipped, see golang.org/issue/5885")
1376 var (
1377 thres = 1
1378 sig = syscall_dot_SIGCHLD
1379 )
1380 type result struct {
1381 n int
1382 sig os.Signal
1383 }
1384 var (
1385 sigCh = make(chan os.Signal, 10)
1386 waitStart = make(chan struct{})
1387 waitDone = make(chan result)
1388 )
1389
1390 signal.Notify(sigCh, sig)
1391
1392 go func() {
1393 n := 0
1394 alarm := time.After(time.Second * 3)
1395 for {
1396 select {
1397 case <-waitStart:
1398 waitStart = nil
1399 case v := <-sigCh:
1400 n++
1401 if v != sig || n > thres {
1402 waitDone <- result{n, v}
1403 return
1404 }
1405 case <-alarm:
1406 waitDone <- result{n, sig}
1407 return
1408 }
1409 }
1410 }()
1411
1412 waitStart <- struct{}{}
1413 C.testSendSIG()
1414 r := <-waitDone
1415 if r.sig != sig {
1416 t.Fatalf("received signal %v, but want %v", r.sig, sig)
1417 }
1418 t.Logf("got %d signals\n", r.n)
1419 if r.n <= thres {
1420 t.Fatalf("expected more than %d", thres)
1421 }
1422 }
1423
1424
1425
1426 func testLibgcc(t *testing.T) {
1427 var table = []struct {
1428 in, out C.int
1429 }{
1430 {0, 0},
1431 {1, 1},
1432 {-42, 42},
1433 {1000300, 1000300},
1434 {1 - 1<<31, 1<<31 - 1},
1435 }
1436 for _, v := range table {
1437 if o := C.vabs(v.in); o != v.out {
1438 t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
1439 return
1440 }
1441 }
1442 }
1443
1444
1445
1446 func test3729(t *testing.T) {
1447 if runtime.GOOS == "windows" {
1448 t.Skip("skipping on windows")
1449 }
1450
1451 _, e := C.g()
1452 if e != syscall.E2BIG {
1453 t.Errorf("got %q, expect %q", e, syscall.E2BIG)
1454 }
1455 _, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
1456 if e != syscall.EINVAL {
1457 t.Errorf("got %q, expect %q", e, syscall.EINVAL)
1458 }
1459 }
1460
1461
1462
1463 func testPrintf(t *testing.T) {
1464 C.say()
1465 }
1466
1467
1468
1469 var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
1470
1471
1472
1473 func test4339(t *testing.T) {
1474 C.handle4339(&C.exported4339)
1475 }
1476
1477
1478
1479 func testBoolAlign(t *testing.T) {
1480 b := C.c_bool(true, true, 10, true, false)
1481 if b != 10 {
1482 t.Fatalf("found %d expected 10\n", b)
1483 }
1484 b = C.c_bool(true, true, 5, true, true)
1485 if b != 5 {
1486 t.Fatalf("found %d expected 5\n", b)
1487 }
1488 b = C.c_bool(true, true, 3, true, false)
1489 if b != 3 {
1490 t.Fatalf("found %d expected 3\n", b)
1491 }
1492 b = C.c_bool(false, false, 1, true, false)
1493 if b != 1 {
1494 t.Fatalf("found %d expected 1\n", b)
1495 }
1496 b = C.c_bool(false, true, 200, true, false)
1497 if b != 200 {
1498 t.Fatalf("found %d expected 200\n", b)
1499 }
1500 }
1501
1502
1503
1504 func test4857() {
1505 _ = C.issue4857()
1506 }
1507
1508
1509
1510 func testCflags(t *testing.T) {
1511 is_windows := C.is_windows == 1
1512 if is_windows != (runtime.GOOS == "windows") {
1513 t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
1514 }
1515 if C.common != 123 {
1516 t.Errorf("common: %v (expected 123)", C.common)
1517 }
1518 }
1519
1520
1521
1522 func test5227(t *testing.T) {
1523 C.init()
1524 }
1525
1526 func selectfont() C.Fontinfo {
1527 return C.SansTypeface
1528 }
1529
1530
1531
1532 func test5242(t *testing.T) {
1533 if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
1534 t.Errorf("got %v", got)
1535 }
1536 }
1537
1538 func test5603(t *testing.T) {
1539 var x [5]int64
1540 exp := int64(C.issue5603exp)
1541 x[0] = int64(C.issue5603foo0())
1542 x[1] = int64(C.issue5603foo1(nil))
1543 x[2] = int64(C.issue5603foo2(nil, nil))
1544 x[3] = int64(C.issue5603foo3(nil, nil, nil))
1545 x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
1546 for i, v := range x {
1547 if v != exp {
1548 t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
1549 }
1550 }
1551 }
1552
1553
1554
1555 func test5337(t *testing.T) {
1556 C.test5337()
1557 }
1558
1559
1560
1561 func test5740(t *testing.T) {
1562 if v := C.test5740a() + C.test5740b(); v != 5 {
1563 t.Errorf("expected 5, got %v", v)
1564 }
1565 }
1566
1567
1568
1569 func test5986(t *testing.T) {
1570 C.output5986()
1571 }
1572
1573
1574
1575 func test6128() {
1576
1577 _ = C.X
1578 }
1579
1580
1581
1582 func test6390(t *testing.T) {
1583 p1 := C.malloc(1024)
1584 if p1 == nil {
1585 t.Fatalf("C.malloc(1024) returned nil")
1586 }
1587 p2 := C.malloc(0)
1588 if p2 == nil {
1589 t.Fatalf("C.malloc(0) returned nil")
1590 }
1591 C.free(p1)
1592 C.free(p2)
1593 }
1594
1595 func test6472() {
1596
1597 s := new(C.z)
1598 println(s.y[0].x)
1599 }
1600
1601
1602
1603 func test6506() {
1604
1605 var x C.size_t
1606
1607 C.calloc(x, x)
1608 C.malloc(x)
1609 C.realloc(nil, x)
1610 C.memcpy(nil, nil, x)
1611 C.memcmp(nil, nil, x)
1612 C.memmove(nil, nil, x)
1613 C.strncpy(nil, nil, x)
1614 C.strncmp(nil, nil, x)
1615 C.strncat(nil, nil, x)
1616 x = C.strxfrm(nil, nil, x)
1617 C.memchr(nil, 0, x)
1618 x = C.strcspn(nil, nil)
1619 x = C.strspn(nil, nil)
1620 C.memset(nil, 0, x)
1621 x = C.strlen(nil)
1622 _ = x
1623 }
1624
1625
1626
1627 func testNaming(t *testing.T) {
1628 C.myfunc()
1629 C.myfunc_def()
1630 if v := C.myvar; v != 5 {
1631 t.Errorf("C.myvar = %d, want 5", v)
1632 }
1633 if v := C.myvar_def; v != 5 {
1634 t.Errorf("C.myvar_def = %d, want 5", v)
1635 }
1636 if s := C.GoString(C.mytext); s != "abcdef" {
1637 t.Errorf("C.mytext = %q, want %q", s, "abcdef")
1638 }
1639 if s := C.GoString(C.mytext_def); s != "abcdef" {
1640 t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
1641 }
1642 if c := C.myenum; c != 1234 {
1643 t.Errorf("C.myenum = %v, want 1234", c)
1644 }
1645 if c := C.myenum_def; c != 1234 {
1646 t.Errorf("C.myenum_def = %v, want 1234", c)
1647 }
1648 {
1649 const c = C.myenum
1650 if c != 1234 {
1651 t.Errorf("C.myenum as const = %v, want 1234", c)
1652 }
1653 }
1654 {
1655 const c = C.myenum_def
1656 if c != 1234 {
1657 t.Errorf("C.myenum as const = %v, want 1234", c)
1658 }
1659 }
1660 if c := C.myint_def; c != 12345 {
1661 t.Errorf("C.myint_def = %v, want 12345", c)
1662 }
1663 {
1664 const c = C.myint_def
1665 if c != 12345 {
1666 t.Errorf("C.myint as const = %v, want 12345", c)
1667 }
1668 }
1669
1670 if c := C.myfloat_def; c != 1.5 {
1671 t.Errorf("C.myint_def = %v, want 1.5", c)
1672 }
1673 {
1674 const c = C.myfloat_def
1675 if c != 1.5 {
1676 t.Errorf("C.myint as const = %v, want 1.5", c)
1677 }
1678 }
1679
1680 if s := C.mystring_def; s != "hello" {
1681 t.Errorf("C.mystring_def = %q, want %q", s, "hello")
1682 }
1683 }
1684
1685
1686
1687 func test6907(t *testing.T) {
1688 want := "yarn"
1689 s := C.Issue6907CopyString(want)
1690 defer C.free(unsafe.Pointer(s))
1691 if got := C.GoString(s); got != want {
1692 t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
1693 }
1694 }
1695
1696
1697
1698 func test7560(t *testing.T) {
1699
1700 if C.offset7560() != 1 {
1701 t.Skip("C compiler did not pack struct")
1702 }
1703
1704
1705
1706 var v C.misaligned
1707 rt := reflect.TypeOf(&v).Elem()
1708 if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
1709 t.Errorf("unexpected fields in C.misaligned:\n")
1710 for i := 0; i < rt.NumField(); i++ {
1711 t.Logf("%+v\n", rt.Field(i))
1712 }
1713 }
1714 }
1715
1716
1717
1718 func f() {
1719 var x1 *C.typedef_test7786
1720 var x2 *C.struct_test7786
1721 x1 = x2
1722 x2 = x1
1723 C.f7786(x1)
1724 C.f7786(x2)
1725 C.g7786(x1)
1726 C.g7786(x2)
1727
1728 var b1 *C.typedef_body7786
1729 var b2 *C.struct_body7786
1730 b1 = b2
1731 b2 = b1
1732 C.b7786(b1)
1733 C.b7786(b2)
1734 C.c7786(b1)
1735 C.c7786(b2)
1736
1737 var u1 *C.typedef_union7786
1738 var u2 *C.union_union7786
1739 u1 = u2
1740 u2 = u1
1741 C.u7786(u1)
1742 C.u7786(u2)
1743 C.v7786(u1)
1744 C.v7786(u2)
1745 }
1746
1747
1748
1749 func test8092(t *testing.T) {
1750 tests := []struct {
1751 s string
1752 a, b *C.char
1753 }{
1754 {"text", &C.text[0], C.ctext()},
1755 {"data", &C.data[0], C.cdata()},
1756 }
1757 for _, test := range tests {
1758 if test.a != test.b {
1759 t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
1760 }
1761 if got := C.GoString(test.a); got != test.s {
1762 t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
1763 }
1764 }
1765 }
1766
1767
1768
1769 func issue8368(one *C.struct_one, two *C.struct_two) {
1770 }
1771
1772 func issue8441(one *C.one, two *C.two) {
1773 issue8441(two.x, one.x)
1774 }
1775
1776
1777
1778 var _ = C.struct_issue8428one{
1779 b: C.char(0),
1780
1781
1782
1783 }
1784
1785 var _ = C.struct_issue8428two{
1786 p: unsafe.Pointer(nil),
1787 b: C.char(0),
1788 rest: [0]C.char{},
1789 }
1790
1791 var _ = C.struct_issue8428three{
1792 w: [1][2][3][0]C.char{},
1793 x: [2][3][0][1]C.char{},
1794 y: [3][0][1][2]C.char{},
1795 z: [0][1][2][3]C.char{},
1796 }
1797
1798
1799
1800 func test8811(t *testing.T) {
1801 C.issue8811Execute()
1802 }
1803
1804
1805
1806 func test9557(t *testing.T) {
1807
1808 foo := C.issue9557foo
1809 if v := foo.a; v != 42 {
1810 t.Fatalf("foo.a expected 42, but got %d", v)
1811 }
1812
1813
1814 if v := (*C.issue9557foo).a; v != 42 {
1815 t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
1816 }
1817
1818
1819 if v := C.issue9557foo.a; v != 42 {
1820 t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
1821 }
1822 }
1823
1824
1825
1826 func issue8331a() C.issue8331 {
1827 return issue8331Var
1828 }
1829
1830
1831
1832 func test10303(t *testing.T, n int) {
1833 if asan.Enabled {
1834 t.Skip("variable z is heap-allocated due to extra allocations with -asan; see #70079")
1835 }
1836 if runtime.Compiler == "gccgo" {
1837 t.Skip("gccgo permits C pointers on the stack")
1838 }
1839
1840
1841
1842 if n > 0 {
1843 test10303(t, n-1)
1844 }
1845 if t.Failed() {
1846 return
1847 }
1848 var x, y, z, v, si C.int
1849 var s C.Struct
1850 C.setintstar(&x)
1851 C.setintptr(&y)
1852 C.setvoidptr(unsafe.Pointer(&v))
1853 s.P = &si
1854 C.setstruct(s)
1855
1856 if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
1857 t.Error("C int* argument on stack")
1858 }
1859 if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
1860 t.Error("C intptr argument on stack")
1861 }
1862 if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
1863 t.Error("C void* argument on stack")
1864 }
1865 if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
1866 t.Error("C struct field pointer on stack")
1867 }
1868 }
1869
1870
1871
1872 func test11925(t *testing.T) {
1873 if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
1874 t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
1875 }
1876 if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
1877 t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
1878 }
1879 }
1880
1881
1882
1883 func test12030(t *testing.T) {
1884 buf := (*C.char)(C.malloc(256))
1885 defer C.free(unsafe.Pointer(buf))
1886 for _, f := range []float64{1.0, 2.0, 3.14} {
1887 C.issue12030conv(buf, C.double(f))
1888 got := C.GoString(buf)
1889 if want := fmt.Sprintf("d=%g", f); got != want {
1890 t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
1891 }
1892 }
1893 }
1894
1895
1896
1897 var _ C.complexfloat
1898 var _ C.complexdouble
1899
1900
1901
1902
1903
1904 var _, _ = C.abs(0)
1905
1906
1907
1908 func test14838(t *testing.T) {
1909 data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
1910 cData := C.CBytes(data)
1911 defer C.free(cData)
1912
1913 if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
1914 t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
1915 }
1916 }
1917
1918
1919
1920 var sink C.int
1921
1922 func test17065(t *testing.T) {
1923 if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
1924 t.Skip("broken on darwin; issue 17065")
1925 }
1926 for i := range C.ii {
1927 sink = C.ii[i]
1928 }
1929 }
1930
1931
1932
1933 func test17537(t *testing.T) {
1934 v := C.S17537{i: 17537}
1935 if got, want := C.I17537(&v), C.int(17537); got != want {
1936 t.Errorf("got %d, want %d", got, want)
1937 }
1938
1939 p := (*C.char)(C.malloc(1))
1940 defer C.free(unsafe.Pointer(p))
1941 *p = 17
1942 if got, want := C.F17537(&p), C.int(17); got != want {
1943 t.Errorf("got %d, want %d", got, want)
1944 }
1945
1946 C.F18298(nil)
1947 var v18298 C.T18298_2
1948 C.G18298(C.T18298_1(v18298))
1949 }
1950
1951
1952
1953 func testAPI() {
1954 var cs *C.char
1955 cs = C.CString("hello")
1956 defer C.free(unsafe.Pointer(cs))
1957 var s string
1958 s = C.GoString((*C.char)(C.api_hello))
1959 s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
1960 var b []byte
1961 b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
1962 _, _ = s, b
1963 C.cstring_pointer_fun(nil)
1964 }
1965
1966
1967
1968 func test18126(t *testing.T) {
1969 p := C.malloc(1)
1970 _, err := C.Issue18126C(&p)
1971 C.free(p)
1972 _ = err
1973 }
1974
1975
1976
1977 func test18720(t *testing.T) {
1978 if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
1979 t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
1980 }
1981
1982 if got, want := C.VAR1, C.int(5); got != want {
1983 t.Errorf("C.VAR1 == %v, expected %v", got, want)
1984 }
1985
1986 if got, want := *C.ADDR, C.int(5); got != want {
1987 t.Errorf("*C.ADDR == %v, expected %v", got, want)
1988 }
1989
1990 if got, want := C.CALL, C.int(6); got != want {
1991 t.Errorf("C.CALL == %v, expected %v", got, want)
1992 }
1993
1994 if got, want := C.CALL, C.int(7); got != want {
1995 t.Errorf("C.CALL == %v, expected %v", got, want)
1996 }
1997
1998
1999 if got, want := C.SIZE_OF_FOO, 1; got != want {
2000 t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
2001 }
2002 }
2003
2004
2005
2006 func test20129(t *testing.T) {
2007 if C.issue20129 != 0 {
2008 t.Fatal("test is broken")
2009 }
2010 C.issue20129Foo()
2011 if C.issue20129 != 1 {
2012 t.Errorf("got %v but expected %v", C.issue20129, 1)
2013 }
2014 C.issue20129Bar()
2015 if C.issue20129 != 2 {
2016 t.Errorf("got %v but expected %v", C.issue20129, 2)
2017 }
2018 }
2019
2020
2021
2022 func test20369(t *testing.T) {
2023 if C.XUINT64_MAX != math.MaxUint64 {
2024 t.Fatalf("got %v, want %v", uint64(C.XUINT64_MAX), uint64(math.MaxUint64))
2025 }
2026 }
2027
2028
2029
2030 var issue21668_X = C.x21668
2031
2032
2033
2034 func test21708(t *testing.T) {
2035 if got, want := C.CAST_TO_INT64, -1; got != want {
2036 t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
2037 }
2038 }
2039
2040
2041
2042 func test21809(t *testing.T) {
2043 longVar := C.long(3)
2044 typedefVar := C.MySigned_t(4)
2045 typedefTypedefVar := C.MySigned2_t(5)
2046
2047
2048 if ret := C.takes_long(longVar); ret != 9 {
2049 t.Errorf("got %v but expected %v", ret, 9)
2050 }
2051 if ret := C.takes_long(typedefVar); ret != 16 {
2052 t.Errorf("got %v but expected %v", ret, 16)
2053 }
2054 if ret := C.takes_long(typedefTypedefVar); ret != 25 {
2055 t.Errorf("got %v but expected %v", ret, 25)
2056 }
2057
2058
2059 if ret := C.takes_typedef(longVar); ret != 9 {
2060 t.Errorf("got %v but expected %v", ret, 9)
2061 }
2062 if ret := C.takes_typedef(typedefVar); ret != 16 {
2063 t.Errorf("got %v but expected %v", ret, 16)
2064 }
2065 if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
2066 t.Errorf("got %v but expected %v", ret, 25)
2067 }
2068 }
2069
2070
2071
2072 func test22906(t *testing.T) {
2073 var x1 C.jobject = 0
2074 _ = x1
2075 var x2 C.jclass = 0
2076 _ = x2
2077 var x3 C.jthrowable = 0
2078 _ = x3
2079 var x4 C.jstring = 0
2080 _ = x4
2081 var x5 C.jarray = 0
2082 _ = x5
2083 var x6 C.jbooleanArray = 0
2084 _ = x6
2085 var x7 C.jbyteArray = 0
2086 _ = x7
2087 var x8 C.jcharArray = 0
2088 _ = x8
2089 var x9 C.jshortArray = 0
2090 _ = x9
2091 var x10 C.jintArray = 0
2092 _ = x10
2093 var x11 C.jlongArray = 0
2094 _ = x11
2095 var x12 C.jfloatArray = 0
2096 _ = x12
2097 var x13 C.jdoubleArray = 0
2098 _ = x13
2099 var x14 C.jobjectArray = 0
2100 _ = x14
2101 var x15 C.jweak = 0
2102 _ = x15
2103 }
2104
2105
2106
2107 var Vissue22958 C.issue22958Type
2108
2109 func test23356(t *testing.T) {
2110 if got, want := C.a(), C.int(5); got != want {
2111 t.Errorf("C.a() == %v, expected %v", got, want)
2112 }
2113 if got, want := C.r(), C.int(3); got != want {
2114 t.Errorf("C.r() == %v, expected %v", got, want)
2115 }
2116 }
2117
2118
2119
2120 func Issue23720F() {
2121 var x C.issue23720A
2122 C.issue23720F(x)
2123 }
2124
2125
2126
2127 func test24206(t *testing.T) {
2128 if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
2129 t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
2130 }
2131
2132 if l := len(C.GoString(C.dangerousString1())); l != 123 {
2133 t.Errorf("Incorrect string length - got %d, want 123", l)
2134 }
2135 if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
2136 t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
2137 }
2138 }
2139
2140
2141
2142 func issue25143sum(ns ...C.int) C.int {
2143 total := C.int(0)
2144 for _, n := range ns {
2145 total += n
2146 }
2147 return total
2148 }
2149
2150 func test25143(t *testing.T) {
2151 if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
2152 t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
2153 }
2154 }
2155
2156
2157
2158
2159 func test26066(t *testing.T) {
2160 var i = int64(C.issue26066)
2161 if i != -1 {
2162 t.Errorf("got %d, want -1", i)
2163 }
2164 }
2165
2166
2167 var a C.TypeOne
2168 var b C.TypeTwo
2169
2170
2171
2172
2173
2174
2175
2176 func test27660(t *testing.T) {
2177 ctx, cancel := context.WithCancel(context.Background())
2178 defer cancel()
2179 ints := make([]int, 100)
2180 locks := make([]sync.Mutex, 100)
2181
2182
2183 for i := 0; i < 100; i++ {
2184 go func() {
2185 for ctx.Err() == nil {
2186
2187
2188 C.usleep(1000 )
2189 runtime.Gosched()
2190 }
2191 }()
2192 go func() {
2193
2194
2195
2196
2197 i := 0
2198 for ctx.Err() == nil {
2199 j := rand.Intn(100)
2200 locks[j].Lock()
2201 ints[j]++
2202 locks[j].Unlock()
2203
2204
2205
2206 if i%(1<<24) == 0 {
2207 runtime.Gosched()
2208 }
2209 i++
2210
2211 }
2212 }()
2213 time.Sleep(time.Millisecond)
2214 }
2215 }
2216
2217
2218
2219 func twoargsF() {
2220 var v struct{ p *byte }
2221 C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
2222 }
2223
2224
2225
2226 func issue28545G(p **C.char) {
2227 C.issue28545F(p, -1, (0))
2228 C.issue28545F(p, 2+3, complex(1, 1))
2229 C.issue28545F(p, issue28772Constant, issue28772Constant2)
2230 }
2231
2232
2233
2234 const issue28772Constant = C.issue28772Constant
2235
2236
2237
2238 func offset(i int) uintptr {
2239 var pi C.innerPacked
2240 var po C.outerPacked
2241 var ui C.innerUnpacked
2242 var uo C.outerUnpacked
2243 switch i {
2244 case 0:
2245 return unsafe.Offsetof(pi.f2)
2246 case 1:
2247 return unsafe.Offsetof(po.g2)
2248 case 2:
2249 return unsafe.Offsetof(ui.f2)
2250 case 3:
2251 return unsafe.Offsetof(uo.g2)
2252 default:
2253 panic("can't happen")
2254 }
2255 }
2256
2257 func test28896(t *testing.T) {
2258 for i := 0; i < 4; i++ {
2259 c := uintptr(C.offset(C.int(i)))
2260 g := offset(i)
2261 if c != g {
2262 t.Errorf("%d: C: %d != Go %d", i, c, g)
2263 }
2264 }
2265 }
2266
2267
2268
2269
2270
2271
2272 func Issue29383(n, size uint) int {
2273 if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
2274 return 0
2275 }
2276 return 0
2277 }
2278
2279
2280
2281
2282
2283 var Vissue29748 = C.f29748(&C.S29748{
2284 nil,
2285 })
2286
2287 func Fissue299748() {
2288 C.f29748(&C.S29748{
2289 nil,
2290 })
2291 }
2292
2293
2294
2295 var issue29781X struct{ X int }
2296
2297 func issue29781F(...int) int { return 0 }
2298
2299 func issue29781G() {
2300 var p *C.char
2301 C.issue29781F(&p, C.ISSUE29781C+1)
2302 C.issue29781F(nil, (C.int)(
2303 0))
2304 C.issue29781F(&p, (C.int)(0))
2305 C.issue29781F(&p, (C.int)(
2306 0))
2307 C.issue29781F(&p, (C.int)(issue29781X.
2308 X))
2309 }
2310
2311
2312
2313 func test30065(t *testing.T) {
2314 var a [256]byte
2315 b := []byte("a")
2316 C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
2317 if a[0] != 'a' {
2318 t.Errorf("&a failed: got %c, want %c", a[0], 'a')
2319 }
2320
2321 b = []byte("b")
2322 C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
2323 if a[0] != 'b' {
2324 t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
2325 }
2326
2327 d := make([]byte, 256)
2328 b = []byte("c")
2329 C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
2330 if d[0] != 'c' {
2331 t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
2332 }
2333 }
2334
2335
2336
2337
2338 func Issue31093() {
2339 C.issue31093F(C.ushort(0))
2340 }
2341
2342
2343
2344 func test32579(t *testing.T) {
2345 var s [1]C.struct_S32579
2346 C.memset(unsafe.Pointer(&s[0].data[0]), 1, 1)
2347 if s[0].data[0] != 1 {
2348 t.Errorf("&s[0].data[0] failed: got %d, want %d", s[0].data[0], 1)
2349 }
2350 }
2351
2352
2353
2354 func testHandle(t *testing.T) {
2355 ch := make(chan int)
2356
2357 for i := 0; i < 42; i++ {
2358 h := cgo.NewHandle(ch)
2359 go func() {
2360 C.cFunc37033(C.uintptr_t(h))
2361 }()
2362 if v := <-ch; issue37033 != v {
2363 t.Fatalf("unexpected receiving value: got %d, want %d", v, issue37033)
2364 }
2365 h.Delete()
2366 }
2367 }
2368
2369
2370
2371 var issue38649 C.netbsd_gid = 42
2372
2373
2374
2375 var issue39877 *C.void = nil
2376
2377
2378
2379
2380 func Issue40494() {
2381 C.issue40494(C.enum_Enum40494(C.X_40494), (*C.union_Union40494)(nil))
2382 }
2383
2384
2385 func test45451(t *testing.T) {
2386 var u *C.issue45451
2387 typ := reflect.ValueOf(u).Type().Elem()
2388
2389
2390 defer func() {
2391 if r := recover(); r == nil {
2392 t.Error("expected panic")
2393 }
2394 }()
2395
2396 _ = reflect.New(typ)
2397 t.Errorf("reflect.New(%v) should have panicked", typ)
2398 }
2399
2400
2401
2402 func func52542[T ~[]C.int]() {}
2403
2404 type type52542[T ~*C.float] struct{}
2405
2406
2407 func issue67517() {
2408 C.issue67517(&C.issue67517struct{
2409 a: 0,
2410
2411 b: nil,
2412 })
2413 C.issue67517(&C.issue67517struct{
2414 a: 0,
2415
2416 b: nil,
2417 })
2418 C.issue67517(&C.issue67517struct{
2419 a: 0 +
2420
2421 1,
2422
2423 b: nil,
2424 })
2425 }
2426
2427
2428 func test69086(t *testing.T) {
2429 var s C.issue69086struct
2430
2431 typ := reflect.TypeOf(s)
2432 for i := 0; i < typ.NumField(); i++ {
2433 f := typ.Field(i)
2434 t.Logf("field %d: name %s size %d align %d offset %d", i, f.Name, f.Type.Size(), f.Type.Align(), f.Offset)
2435 }
2436
2437 s.c = 1
2438 got := C.issue690861(&s)
2439 if got != 1 {
2440 t.Errorf("field: got %d, want 1", got)
2441 }
2442 got = C.issue690862(1, 2, 3, s)
2443 if got != 1234 {
2444 t.Errorf("call: got %d, want 1234", got)
2445 }
2446 }
2447
2448
2449 func test75751() int {
2450 return int(*C.issue75751m) + int(*C.issue75751m2)
2451 }
2452
2453
2454 func test76340(t *testing.T) {
2455 var emptyInterface C.GoInterface
2456 r1 := C.issue76340testFromC(emptyInterface)
2457 if r1 != 0 {
2458 t.Errorf("issue76340testFromC with nil interface: got %d, want 0", r1)
2459 }
2460
2461 r2 := C.issue76340returnFromC(42)
2462 if r2.t == nil && r2.v == nil {
2463 t.Error("issue76340returnFromC(42) returned nil interface")
2464 }
2465
2466 r3 := C.issue76340returnFromC(0)
2467 if r3.t != nil || r3.v != nil {
2468 t.Errorf("issue76340returnFromC(0) returned non-nil interface: got %v, want nil", r3)
2469 }
2470 }
2471
2472 func testDITCgo(t *testing.T) {
2473 if !sys.DITSupported {
2474 t.Skip("CPU does not support DIT")
2475 }
2476
2477 ditAlreadyEnabled := sys.DITEnabled()
2478 C.enableDIT()
2479
2480 if ditAlreadyEnabled != sys.DITEnabled() {
2481 t.Fatalf("DIT state not preserved across cgo call: before %t, after %t", ditAlreadyEnabled, sys.DITEnabled())
2482 }
2483
2484 subtle.WithDataIndependentTiming(func() {
2485 C.disableDIT()
2486
2487 if !sys.DITEnabled() {
2488 t.Fatal("DIT disabled after disabling in cgo call")
2489 }
2490 })
2491 }
2492
2493 func testDITCgoCallback(t *testing.T) {
2494 if !sys.DITSupported {
2495 t.Skip("CPU does not support DIT")
2496 }
2497
2498 ditAlreadyEnabled := sys.DITEnabled()
2499
2500 subtle.WithDataIndependentTiming(func() {
2501 if C.ditCallbackTest() != 1 {
2502 t.Fatal("DIT not enabled in cgo callback within WithDataIndependentTiming")
2503 }
2504 })
2505
2506 if ditAlreadyEnabled != sys.DITEnabled() {
2507 t.Fatalf("DIT state not preserved across cgo callback: before %t, after %t", ditAlreadyEnabled, sys.DITEnabled())
2508 }
2509 }
2510
2511 func testDITCgoCallbackEnableDIT(t *testing.T) {
2512 if !sys.DITSupported {
2513 t.Skip("CPU does not support DIT")
2514 }
2515
2516 ditAlreadyEnabled := sys.DITEnabled()
2517
2518 C.ditCallbackEnableDIT()
2519
2520 if ditAlreadyEnabled != sys.DITEnabled() {
2521 t.Fatalf("DIT state not preserved across cgo callback: before %t, after %t", ditAlreadyEnabled, sys.DITEnabled())
2522 }
2523 }
2524
2525 func testDITCgoCallbackDisableDIT(t *testing.T) {
2526 if !sys.DITSupported {
2527 t.Skip("CPU does not support DIT")
2528 }
2529
2530 ditAlreadyEnabled := sys.DITEnabled()
2531
2532 subtle.WithDataIndependentTiming(func() {
2533 C.ditCallbackDisableDIT()
2534
2535 if !sys.DITEnabled() {
2536 t.Fatal("DIT disabled after disabling in cgo call")
2537 }
2538 })
2539
2540 if ditAlreadyEnabled != sys.DITEnabled() {
2541 t.Fatalf("DIT state not preserved across cgo callback: before %t, after %t", ditAlreadyEnabled, sys.DITEnabled())
2542 }
2543 }
2544
View as plain text