github.com/bir3/gocompiler@v0.9.2202/src/cmd/cgo/internal/test/test.go (about)

     1  // Copyright 2010 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  // Test cases for cgo.
     6  // Both the import "C" prologue and the main file are sorted by issue number.
     7  // This file contains C definitions (not just declarations)
     8  // and so it must NOT contain any //export directives on Go functions.
     9  // See testx.go for exports.
    10  
    11  package cgotest
    12  
    13  /*
    14  #include <complex.h>
    15  #include <math.h>
    16  #include <stdarg.h>
    17  #include <stdbool.h>
    18  #include <stddef.h>
    19  #include <stdint.h>
    20  #include <stdio.h>
    21  #include <stdlib.h>
    22  #include <string.h>
    23  #include <unistd.h>
    24  #include <sys/stat.h>
    25  #include <errno.h>
    26  #cgo !darwin LDFLAGS: -lm
    27  
    28  #ifndef WIN32
    29  #include <pthread.h>
    30  #include <signal.h>
    31  #endif
    32  
    33  // alignment tests
    34  
    35  typedef unsigned char Uint8;
    36  typedef unsigned short Uint16;
    37  
    38  typedef enum {
    39   MOD1 = 0x0000,
    40   MODX = 0x8000
    41  } SDLMod;
    42  
    43  typedef enum {
    44   A1 = 1,
    45   B1 = 322,
    46   SDLK_LAST
    47  } SDLKey;
    48  
    49  typedef struct SDL_keysym {
    50  	Uint8 scancode;
    51  	SDLKey sym;
    52  	SDLMod mod;
    53  	Uint16 unicode;
    54  } SDL_keysym;
    55  
    56  typedef struct SDL_KeyboardEvent {
    57  	Uint8 typ;
    58  	Uint8 which;
    59  	Uint8 state;
    60  	SDL_keysym keysym;
    61  } SDL_KeyboardEvent;
    62  
    63  void makeEvent(SDL_KeyboardEvent *event) {
    64   unsigned char *p;
    65   int i;
    66  
    67   p = (unsigned char*)event;
    68   for (i=0; i<sizeof *event; i++) {
    69     p[i] = i;
    70   }
    71  }
    72  
    73  int same(SDL_KeyboardEvent* e, Uint8 typ, Uint8 which, Uint8 state, Uint8 scan, SDLKey sym, SDLMod mod, Uint16 uni) {
    74    return e->typ == typ && e->which == which && e->state == state && e->keysym.scancode == scan && e->keysym.sym == sym && e->keysym.mod == mod && e->keysym.unicode == uni;
    75  }
    76  
    77  void cTest(SDL_KeyboardEvent *event) {
    78   printf("C: %#x %#x %#x %#x %#x %#x %#x\n", event->typ, event->which, event->state,
    79     event->keysym.scancode, event->keysym.sym, event->keysym.mod, event->keysym.unicode);
    80   fflush(stdout);
    81  }
    82  
    83  // api
    84  
    85  const char *greeting = "hello, world";
    86  
    87  // basic test cases
    88  
    89  #define SHIFT(x, y)  ((x)<<(y))
    90  #define KILO SHIFT(1, 10)
    91  #define UINT32VAL 0xc008427bU
    92  
    93  enum E {
    94  	Enum1 = 1,
    95  	Enum2 = 2,
    96  };
    97  
    98  typedef unsigned char cgo_uuid_t[20];
    99  
   100  void uuid_generate(cgo_uuid_t x) {
   101  	x[0] = 0;
   102  }
   103  
   104  struct S {
   105  	int x;
   106  };
   107  
   108  const char *cstr = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890";
   109  
   110  extern enum E myConstFunc(struct S* const ctx, int const id, struct S **const filter);
   111  
   112  enum E myConstFunc(struct S *const ctx, int const id, struct S **const filter) { return 0; }
   113  
   114  int add(int x, int y) {
   115  	return x+y;
   116  };
   117  
   118  // escape vs noescape
   119  
   120  // TODO(#56378): enable in Go 1.23:
   121  // #cgo noescape handleGoStringPointerNoescape
   122  void handleGoStringPointerNoescape(void *s) {}
   123  
   124  void handleGoStringPointerEscape(void *s) {}
   125  
   126  // Following mimics vulkan complex definitions for benchmarking cgocheck overhead.
   127  
   128  typedef uint32_t VkFlags;
   129  typedef VkFlags  VkDeviceQueueCreateFlags;
   130  typedef uint32_t VkStructureType;
   131  
   132  typedef struct VkDeviceQueueCreateInfo {
   133      VkStructureType             sType;
   134      const void*                 pNext;
   135      VkDeviceQueueCreateFlags    flags;
   136      uint32_t                    queueFamilyIndex;
   137      uint32_t                    queueCount;
   138      const float*                pQueuePriorities;
   139  } VkDeviceQueueCreateInfo;
   140  
   141  typedef struct VkPhysicalDeviceFeatures {
   142      uint32_t bools[56];
   143  } VkPhysicalDeviceFeatures;
   144  
   145  typedef struct VkDeviceCreateInfo {
   146      VkStructureType                    sType;
   147      const void*                        pNext;
   148      VkFlags                            flags;
   149      uint32_t                           queueCreateInfoCount;
   150      const VkDeviceQueueCreateInfo*     pQueueCreateInfos;
   151      uint32_t                           enabledLayerCount;
   152      const char* const*                 ppEnabledLayerNames;
   153      uint32_t                           enabledExtensionCount;
   154      const char* const*                 ppEnabledExtensionNames;
   155      const VkPhysicalDeviceFeatures*    pEnabledFeatures;
   156  } VkDeviceCreateInfo;
   157  
   158  void handleComplexPointer(VkDeviceCreateInfo *a0) {}
   159  void handleComplexPointer8(
   160  	VkDeviceCreateInfo *a0, VkDeviceCreateInfo *a1, VkDeviceCreateInfo *a2, VkDeviceCreateInfo *a3,
   161  	VkDeviceCreateInfo *a4, VkDeviceCreateInfo *a5, VkDeviceCreateInfo *a6, VkDeviceCreateInfo *a7
   162  ) {}
   163  
   164  // complex alignment
   165  
   166  struct {
   167  	float x;
   168  	_Complex float y;
   169  } cplxAlign = { 3.14, 2.17 };
   170  
   171  // constants and pointer checking
   172  
   173  #define CheckConstVal 0
   174  
   175  typedef struct {
   176  	int *p;
   177  } CheckConstStruct;
   178  
   179  static void CheckConstFunc(CheckConstStruct *p, int e) {}
   180  
   181  // duplicate symbol
   182  
   183  int base_symbol = 0;
   184  #define alias_one base_symbol
   185  #define alias_two base_symbol
   186  
   187  // function pointer variables
   188  
   189  typedef int (*intFunc) ();
   190  
   191  int
   192  bridge_int_func(intFunc f)
   193  {
   194  	return f();
   195  }
   196  
   197  int fortytwo()
   198  {
   199  	return 42;
   200  }
   201  
   202  // issue 1222
   203  typedef union {
   204  	long align;
   205  } xxpthread_mutex_t;
   206  struct ibv_async_event {
   207  	union {
   208  		int x;
   209  	} element;
   210  };
   211  struct ibv_context {
   212  	xxpthread_mutex_t mutex;
   213  };
   214  
   215  // issue 1635
   216  // Mac OS X's gcc will generate scattered relocation 2/1 for
   217  // this function on Darwin/386, and 8l couldn't handle it.
   218  // this example is in issue 1635
   219  void scatter() {
   220  	void *p = scatter;
   221  	printf("scatter = %p\n", p);
   222  }
   223  
   224  // Adding this explicit extern declaration makes this a test for
   225  // https://gcc.gnu.org/PR68072 aka https://golang.org/issue/13344 .
   226  // It used to cause a cgo error when building with GCC 6.
   227  extern int hola;
   228  
   229  // this example is in issue 3253
   230  int hola = 0;
   231  int testHola() { return hola; }
   232  
   233  // issue 3250
   234  #ifdef WIN32
   235  void testSendSIG() {}
   236  #else
   237  static void *thread(void *p) {
   238  	const int M = 100;
   239  	int i;
   240  	(void)p;
   241  	for (i = 0; i < M; i++) {
   242  		pthread_kill(pthread_self(), SIGCHLD);
   243  		usleep(rand() % 20 + 5);
   244  	}
   245  	return NULL;
   246  }
   247  void testSendSIG() {
   248  	const int N = 20;
   249  	int i;
   250  	pthread_t tid[N];
   251  	for (i = 0; i < N; i++) {
   252  		usleep(rand() % 200 + 100);
   253  		pthread_create(&tid[i], 0, thread, NULL);
   254  	}
   255  	for (i = 0; i < N; i++)
   256  		pthread_join(tid[i], 0);
   257  }
   258  #endif
   259  
   260  // issue 3261
   261  // libgcc on ARM might be compiled as thumb code, but our 5l
   262  // can't handle that, so we have to disable this test on arm.
   263  #ifdef __ARMEL__
   264  int vabs(int x) {
   265  	puts("testLibgcc is disabled on ARM because 5l cannot handle thumb library.");
   266  	return (x < 0) ? -x : x;
   267  }
   268  #elif defined(__arm64__) && defined(__clang__)
   269  int vabs(int x) {
   270  	puts("testLibgcc is disabled on ARM64 with clang due to lack of libgcc.");
   271  	return (x < 0) ? -x : x;
   272  }
   273  #else
   274  int __absvsi2(int); // dummy prototype for libgcc function
   275  // we shouldn't name the function abs, as gcc might use
   276  // the builtin one.
   277  int vabs(int x) { return __absvsi2(x); }
   278  #endif
   279  
   280  
   281  // issue 3729
   282  // access errno from void C function
   283  const char _expA = 0x42;
   284  const float _expB = 3.14159;
   285  const short _expC = 0x55aa;
   286  const int _expD = 0xdeadbeef;
   287  
   288  #ifdef WIN32
   289  void g(void) {}
   290  void g2(int x, char a, float b, short c, int d) {}
   291  #else
   292  
   293  void g(void) {
   294  	errno = E2BIG;
   295  }
   296  
   297  // try to pass some non-trivial arguments to function g2
   298  void g2(int x, char a, float b, short c, int d) {
   299  	if (a == _expA && b == _expB && c == _expC && d == _expD)
   300  		errno = x;
   301  	else
   302  		errno = -1;
   303  }
   304  #endif
   305  
   306  // issue 3945
   307  // Test that cgo reserves enough stack space during cgo call.
   308  // See https://golang.org/issue/3945 for details.
   309  void say() {
   310  	printf("%s from C\n", "hello");
   311  }
   312  
   313  // issue 4054 part 1 - other half in testx.go
   314  
   315  typedef enum {
   316  	A = 0,
   317  	B,
   318  	C,
   319  	D,
   320  	E,
   321  	F,
   322  	G,
   323  	H,
   324  	II,
   325  	J,
   326  } issue4054a;
   327  
   328  // issue 4339
   329  // We've historically permitted #include <>, so test it here.  Issue 29333.
   330  // Also see issue 41059.
   331  #include <issue4339.h>
   332  
   333  // issue 4417
   334  // cmd/cgo: bool alignment/padding issue.
   335  // bool alignment is wrong and causing wrong arguments when calling functions.
   336  static int c_bool(bool a, bool b, int c, bool d, bool e)  {
   337     return c;
   338  }
   339  
   340  // issue 4857
   341  #cgo CFLAGS: -Werror
   342  const struct { int a; } *issue4857() { return (void *)0; }
   343  
   344  // issue 5224
   345  // Test that the #cgo CFLAGS directive works,
   346  // with and without platform filters.
   347  #cgo CFLAGS: -DCOMMON_VALUE=123
   348  #cgo windows CFLAGS: -DIS_WINDOWS=1
   349  #cgo !windows CFLAGS: -DIS_WINDOWS=0
   350  int common = COMMON_VALUE;
   351  int is_windows = IS_WINDOWS;
   352  
   353  // issue 5227
   354  // linker incorrectly treats common symbols and
   355  // leaves them undefined.
   356  
   357  typedef struct {
   358          int Count;
   359  } Fontinfo;
   360  
   361  Fontinfo SansTypeface;
   362  
   363  extern void init();
   364  
   365  Fontinfo loadfont() {
   366          Fontinfo f = {0};
   367          return f;
   368  }
   369  
   370  void init() {
   371          SansTypeface = loadfont();
   372  }
   373  
   374  // issue 5242
   375  // Cgo incorrectly computed the alignment of structs
   376  // with no Go accessible fields as 0, and then panicked on
   377  // modulo-by-zero computations.
   378  
   379  // issue 50987
   380  // disable arm64 GCC warnings
   381  #cgo CFLAGS: -Wno-psabi -Wno-unknown-warning-option
   382  
   383  typedef struct {
   384  } foo;
   385  
   386  typedef struct {
   387  	int x : 1;
   388  } bar;
   389  
   390  int issue5242(foo f, bar b) {
   391  	return 5242;
   392  }
   393  
   394  // issue 5337
   395  // Verify that we can withstand SIGPROF received on foreign threads
   396  
   397  #ifdef WIN32
   398  void test5337() {}
   399  #else
   400  static void *thread1(void *p) {
   401  	(void)p;
   402  	pthread_kill(pthread_self(), SIGPROF);
   403  	return NULL;
   404  }
   405  void test5337() {
   406  	pthread_t tid;
   407  	pthread_create(&tid, 0, thread1, NULL);
   408  	pthread_join(tid, 0);
   409  }
   410  #endif
   411  
   412  // issue 5603
   413  
   414  const long long issue5603exp = 0x12345678;
   415  long long issue5603foo0() { return issue5603exp; }
   416  long long issue5603foo1(void *p) { return issue5603exp; }
   417  long long issue5603foo2(void *p, void *q) { return issue5603exp; }
   418  long long issue5603foo3(void *p, void *q, void *r) { return issue5603exp; }
   419  long long issue5603foo4(void *p, void *q, void *r, void *s) { return issue5603exp; }
   420  
   421  // issue 5740
   422  
   423  int test5740a(void), test5740b(void);
   424  
   425  // issue 5986
   426  static void output5986()
   427  {
   428      int current_row = 0, row_count = 0;
   429      double sum_squares = 0;
   430      double d;
   431      do {
   432          if (current_row == 10) {
   433              current_row = 0;
   434          }
   435          ++row_count;
   436      }
   437      while (current_row++ != 1);
   438      d =  sqrt(sum_squares / row_count);
   439      printf("sqrt is: %g\n", d);
   440  }
   441  
   442  // issue 6128
   443  // Test handling of #defined names in clang.
   444  // NOTE: Must use hex, or else a shortcut for decimals
   445  // in cgo avoids trying to pass this to clang.
   446  #define X 0x1
   447  
   448  // issue 6472
   449  typedef struct
   450  {
   451          struct
   452          {
   453              int x;
   454          } y[16];
   455  } z;
   456  
   457  // issue 6612
   458  // Test new scheme for deciding whether C.name is an expression, type, constant.
   459  // Clang silences some warnings when the name is a #defined macro, so test those too
   460  // (even though we now use errors exclusively, not warnings).
   461  
   462  void myfunc(void) {}
   463  int myvar = 5;
   464  const char *mytext = "abcdef";
   465  typedef int mytype;
   466  enum {
   467  	myenum = 1234,
   468  };
   469  
   470  #define myfunc_def myfunc
   471  #define myvar_def myvar
   472  #define mytext_def mytext
   473  #define mytype_def mytype
   474  #define myenum_def myenum
   475  #define myint_def 12345
   476  #define myfloat_def 1.5
   477  #define mystring_def "hello"
   478  
   479  // issue 6907
   480  char* Issue6907CopyString(_GoString_ s) {
   481  	size_t n;
   482  	const char *p;
   483  	char *r;
   484  
   485  	n = _GoStringLen(s);
   486  	p = _GoStringPtr(s);
   487  	r = malloc(n + 1);
   488  	memmove(r, p, n);
   489  	r[n] = '\0';
   490  	return r;
   491  }
   492  
   493  // issue 7560
   494  typedef struct {
   495  	char x;
   496  	long y;
   497  } __attribute__((__packed__)) misaligned;
   498  
   499  int
   500  offset7560(void)
   501  {
   502  	return (uintptr_t)&((misaligned*)0)->y;
   503  }
   504  
   505  // issue 7786
   506  // No runtime test, just make sure that typedef and struct/union/class are interchangeable at compile time.
   507  
   508  struct test7786;
   509  typedef struct test7786 typedef_test7786;
   510  void f7786(struct test7786 *ctx) {}
   511  void g7786(typedef_test7786 *ctx) {}
   512  
   513  typedef struct body7786 typedef_body7786;
   514  struct body7786 { int x; };
   515  void b7786(struct body7786 *ctx) {}
   516  void c7786(typedef_body7786 *ctx) {}
   517  
   518  typedef union union7786 typedef_union7786;
   519  void u7786(union union7786 *ctx) {}
   520  void v7786(typedef_union7786 *ctx) {}
   521  
   522  // issue 8092
   523  // Test that linker defined symbols (e.g., text, data) don't
   524  // conflict with C symbols.
   525  char text[] = "text";
   526  char data[] = "data";
   527  char *ctext(void) { return text; }
   528  char *cdata(void) { return data; }
   529  
   530  // issue 8428
   531  // Cgo inconsistently translated zero size arrays.
   532  
   533  struct issue8428one {
   534  	char b;
   535  	char rest[];
   536  };
   537  
   538  struct issue8428two {
   539  	void *p;
   540  	char b;
   541  	char rest[0];
   542  	char pad;
   543  };
   544  
   545  struct issue8428three {
   546  	char w[1][2][3][0];
   547  	char x[2][3][0][1];
   548  	char y[3][0][1][2];
   549  	char z[0][1][2][3];
   550  };
   551  
   552  // issue 8331 part 1 - part 2 in testx.go
   553  // A typedef of an unnamed struct is the same struct when
   554  // #include'd twice.  No runtime test; just make sure it compiles.
   555  #include "issue8331.h"
   556  
   557  // issue 8368 and 8441
   558  // Recursive struct definitions didn't work.
   559  // No runtime test; just make sure it compiles.
   560  typedef struct one one;
   561  typedef struct two two;
   562  struct one {
   563  	two *x;
   564  };
   565  struct two {
   566  	one *x;
   567  };
   568  
   569  // issue 8811
   570  
   571  extern int issue8811Initialized;
   572  extern void issue8811Init();
   573  
   574  void issue8811Execute() {
   575  	if(!issue8811Initialized)
   576  		issue8811Init();
   577  }
   578  
   579  // issue 8945
   580  
   581  typedef void (*PFunc8945)();
   582  PFunc8945 func8945;
   583  
   584  // issue 9557
   585  
   586  struct issue9557_t {
   587    int a;
   588  } test9557bar = { 42 };
   589  struct issue9557_t *issue9557foo = &test9557bar;
   590  
   591  // issue 10303
   592  // Pointers passed to C were not marked as escaping (bug in cgo).
   593  
   594  typedef int *intptr;
   595  
   596  void setintstar(int *x) {
   597  	*x = 1;
   598  }
   599  
   600  void setintptr(intptr x) {
   601  	*x = 1;
   602  }
   603  
   604  void setvoidptr(void *x) {
   605  	*(int*)x = 1;
   606  }
   607  
   608  typedef struct Struct Struct;
   609  struct Struct {
   610  	int *P;
   611  };
   612  
   613  void setstruct(Struct s) {
   614  	*s.P = 1;
   615  }
   616  
   617  // issue 11925
   618  // Structs with zero-length trailing fields are now padded by the Go compiler.
   619  
   620  struct a11925 {
   621  	int i;
   622  	char a[0];
   623  	char b[0];
   624  };
   625  
   626  struct b11925 {
   627  	int i;
   628  	char a[0];
   629  	char b[];
   630  };
   631  
   632  // issue 12030
   633  void issue12030conv(char *buf, double x) {
   634  	sprintf(buf, "d=%g", x);
   635  }
   636  
   637  // issue 14838
   638  
   639  int check_cbytes(char *b, size_t l) {
   640  	int i;
   641  	for (i = 0; i < l; i++) {
   642  		if (b[i] != i) {
   643  			return 0;
   644  		}
   645  	}
   646  	return 1;
   647  }
   648  
   649  // issue 17065
   650  // Test that C symbols larger than a page play nicely with the race detector.
   651  int ii[65537];
   652  
   653  // issue 17537
   654  // The void* cast introduced by cgo to avoid problems
   655  // with const/volatile qualifiers breaks C preprocessor macros that
   656  // emulate functions.
   657  
   658  typedef struct {
   659  	int i;
   660  } S17537;
   661  
   662  int I17537(S17537 *p);
   663  
   664  #define I17537(p) ((p)->i)
   665  
   666  // Calling this function used to fail without the cast.
   667  const int F17537(const char **p) {
   668  	return **p;
   669  }
   670  
   671  // issue 17723
   672  // API compatibility checks
   673  
   674  typedef char *cstring_pointer;
   675  static void cstring_pointer_fun(cstring_pointer dummy) { }
   676  const char *api_hello = "hello!";
   677  
   678  // Calling this function used to trigger an error from the C compiler
   679  // (issue 18298).
   680  void F18298(const void *const *p) {
   681  }
   682  
   683  // Test that conversions between typedefs work as they used to.
   684  typedef const void *T18298_1;
   685  struct S18298 { int i; };
   686  typedef const struct S18298 *T18298_2;
   687  void G18298(T18298_1 t) {
   688  }
   689  
   690  // issue 18126
   691  // cgo check of void function returning errno.
   692  void Issue18126C(void **p) {}
   693  
   694  // issue 18720
   695  
   696  #define HELLO "hello"
   697  #define WORLD "world"
   698  #define HELLO_WORLD HELLO "\000" WORLD
   699  
   700  struct foo { char c; };
   701  #define SIZE_OF(x) sizeof(x)
   702  #define SIZE_OF_FOO SIZE_OF(struct foo)
   703  #define VAR1 VAR
   704  #define VAR var
   705  int var = 5;
   706  
   707  #define ADDR &var
   708  
   709  #define CALL fn()
   710  int fn(void) {
   711  	return ++var;
   712  }
   713  
   714  // issue 20129
   715  
   716  int issue20129 = 0;
   717  typedef void issue20129Void;
   718  issue20129Void issue20129Foo() {
   719  	issue20129 = 1;
   720  }
   721  typedef issue20129Void issue20129Void2;
   722  issue20129Void2 issue20129Bar() {
   723  	issue20129 = 2;
   724  }
   725  
   726  // issue 20369
   727  #define XUINT64_MAX        18446744073709551615ULL
   728  
   729  // issue 21668
   730  // Fail to guess the kind of the constant "x".
   731  // No runtime test; just make sure it compiles.
   732  const int x21668 = 42;
   733  
   734  // issue 21708
   735  #define CAST_TO_INT64 (int64_t)(-1)
   736  
   737  // issue 21809
   738  // Compile C `typedef` to go type aliases.
   739  
   740  typedef long MySigned_t;
   741  // tests alias-to-alias
   742  typedef MySigned_t MySigned2_t;
   743  long takes_long(long x) { return x * x; }
   744  MySigned_t takes_typedef(MySigned_t x) { return x * x; }
   745  
   746  // issue 22906
   747  
   748  // It's going to be hard to include a whole real JVM to test this.
   749  // So we'll simulate a really easy JVM using just the parts we need.
   750  // This is the relevant part of jni.h.
   751  
   752  struct _jobject;
   753  
   754  typedef struct _jobject *jobject;
   755  typedef jobject jclass;
   756  typedef jobject jthrowable;
   757  typedef jobject jstring;
   758  typedef jobject jarray;
   759  typedef jarray jbooleanArray;
   760  typedef jarray jbyteArray;
   761  typedef jarray jcharArray;
   762  typedef jarray jshortArray;
   763  typedef jarray jintArray;
   764  typedef jarray jlongArray;
   765  typedef jarray jfloatArray;
   766  typedef jarray jdoubleArray;
   767  typedef jarray jobjectArray;
   768  
   769  typedef jobject jweak;
   770  
   771  // Note: jvalue is already a non-pointer type due to it being a C union.
   772  
   773  // issue 22958
   774  
   775  typedef struct {
   776  	unsigned long long f8  : 8;
   777  	unsigned long long f16 : 16;
   778  	unsigned long long f24 : 24;
   779  	unsigned long long f32 : 32;
   780  	unsigned long long f40 : 40;
   781  	unsigned long long f48 : 48;
   782  	unsigned long long f56 : 56;
   783  	unsigned long long f64 : 64;
   784  } issue22958Type;
   785  
   786  // issue 23356
   787  int a(void) { return 5; };
   788  int r(void) { return 3; };
   789  
   790  // issue 23720
   791  typedef int *issue23720A;
   792  typedef const int *issue23720B;
   793  void issue23720F(issue23720B a) {}
   794  
   795  // issue 24206
   796  #if defined(__linux__) && defined(__x86_64__)
   797  #include <sys/mman.h>
   798  // Returns string with null byte at the last valid address
   799  char* dangerousString1() {
   800  	int pageSize = 4096;
   801  	char *data = mmap(0, 2 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
   802  	mprotect(data + pageSize,pageSize,PROT_NONE);
   803  	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
   804  	int i = start;
   805  	for (; i < pageSize; i++) {
   806  	data[i] = 'x';
   807  	}
   808  	data[pageSize -1 ] = 0;
   809  	return data+start;
   810  }
   811  
   812  char* dangerousString2() {
   813  	int pageSize = 4096;
   814  	char *data = mmap(0, 3 * pageSize, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, 0, 0);
   815  	mprotect(data + 2 * pageSize,pageSize,PROT_NONE);
   816  	int start = pageSize - 123 - 1; // last 123 bytes of first page + 1 null byte
   817  	int i = start;
   818  	for (; i < 2 * pageSize; i++) {
   819  	data[i] = 'x';
   820  	}
   821  	data[2*pageSize -1 ] = 0;
   822  	return data+start;
   823  }
   824  #else
   825  char *dangerousString1() { return NULL; }
   826  char *dangerousString2() { return NULL; }
   827  #endif
   828  
   829  // issue 26066
   830  const unsigned long long int issue26066 = (const unsigned long long) -1;
   831  
   832  // issue 26517
   833  // Introduce two pointer types which are distinct, but have the same
   834  // base type. Make sure that both of those pointer types get resolved
   835  // correctly. Before the fix for 26517 if one of these pointer types
   836  // was resolved before the other one was processed, the second one
   837  // would never be resolved.
   838  // Before this issue was fixed this test failed on Windows,
   839  // where va_list expands to a named char* type.
   840  typedef va_list TypeOne;
   841  typedef char *TypeTwo;
   842  
   843  // issue 28540
   844  
   845  static void twoargs1(void *p, int n) {}
   846  static void *twoargs2() { return 0; }
   847  static int twoargs3(void * p) { return 0; }
   848  
   849  // issue 28545
   850  // Failed to add type conversion for negative constant.
   851  
   852  static void issue28545F(char **p, int n, complex double a) {}
   853  
   854  // issue 28772 part 1 - part 2 in testx.go
   855  // Failed to add type conversion for Go constant set to C constant.
   856  // No runtime test; just make sure it compiles.
   857  
   858  #define issue28772Constant 1
   859  
   860  // issue 28896
   861  // cgo was incorrectly adding padding after a packed struct.
   862  typedef struct {
   863  	void *f1;
   864  	uint32_t f2;
   865  } __attribute__((__packed__)) innerPacked;
   866  
   867  typedef struct {
   868  	innerPacked g1;
   869  	uint64_t g2;
   870  } outerPacked;
   871  
   872  typedef struct {
   873  	void *f1;
   874  	uint32_t f2;
   875  } innerUnpacked;
   876  
   877  typedef struct {
   878  	innerUnpacked g1;
   879  	uint64_t g2;
   880  } outerUnpacked;
   881  
   882  size_t offset(int x) {
   883  	switch (x) {
   884  	case 0:
   885  		return offsetof(innerPacked, f2);
   886  	case 1:
   887  		return offsetof(outerPacked, g2);
   888  	case 2:
   889  		return offsetof(innerUnpacked, f2);
   890  	case 3:
   891  		return offsetof(outerUnpacked, g2);
   892  	default:
   893  		abort();
   894  	}
   895  }
   896  
   897  // issue 29748
   898  
   899  typedef struct { char **p; } S29748;
   900  static int f29748(S29748 *p) { return 0; }
   901  
   902  // issue 29781
   903  // Error with newline inserted into constant expression.
   904  // Compilation test only, nothing to run.
   905  
   906  static void issue29781F(char **p, int n) {}
   907  #define ISSUE29781C 0
   908  
   909  // issue 31093
   910  static uint16_t issue31093F(uint16_t v) { return v; }
   911  
   912  // issue 32579
   913  typedef struct S32579 { unsigned char data[1]; } S32579;
   914  
   915  // issue 37033, cgo.Handle
   916  extern void GoFunc37033(uintptr_t handle);
   917  void cFunc37033(uintptr_t handle) { GoFunc37033(handle); }
   918  
   919  // issue 38649
   920  // Test that #define'd type aliases work.
   921  #define netbsd_gid unsigned int
   922  
   923  // issue 40494
   924  // Inconsistent handling of tagged enum and union types.
   925  enum Enum40494 { X_40494 };
   926  union Union40494 { int x; };
   927  void issue40494(enum Enum40494 e, union Union40494* up) {}
   928  
   929  // Issue 45451, bad handling of go:notinheap types.
   930  typedef struct issue45451Undefined issue45451;
   931  
   932  // Issue 49633, example of cgo.Handle with void*.
   933  extern void GoFunc49633(void*);
   934  void cfunc49633(void *context) { GoFunc49633(context); }
   935  
   936  */
   937  import "C"
   938  
   939  import (
   940  	"context"
   941  	"fmt"
   942  	"math"
   943  	"math/rand"
   944  	"os"
   945  	"os/signal"
   946  	"reflect"
   947  	"runtime"
   948  	"runtime/cgo"
   949  	"sync"
   950  	"syscall"
   951  	"testing"
   952  	"time"
   953  	"unsafe"
   954  )
   955  
   956  // alignment
   957  
   958  func testAlign(t *testing.T) {
   959  	var evt C.SDL_KeyboardEvent
   960  	C.makeEvent(&evt)
   961  	if C.same(&evt, evt.typ, evt.which, evt.state, evt.keysym.scancode, evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode) == 0 {
   962  		t.Error("*** bad alignment")
   963  		C.cTest(&evt)
   964  		t.Errorf("Go: %#x %#x %#x %#x %#x %#x %#x\n",
   965  			evt.typ, evt.which, evt.state, evt.keysym.scancode,
   966  			evt.keysym.sym, evt.keysym.mod, evt.keysym.unicode)
   967  		t.Error(evt)
   968  	}
   969  }
   970  
   971  // api
   972  
   973  const greeting = "hello, world"
   974  
   975  type testPair struct {
   976  	Name      string
   977  	Got, Want interface{}
   978  }
   979  
   980  var testPairs = []testPair{
   981  	{"GoString", C.GoString(C.greeting), greeting},
   982  	{"GoStringN", C.GoStringN(C.greeting, 5), greeting[:5]},
   983  	{"GoBytes", C.GoBytes(unsafe.Pointer(C.greeting), 5), []byte(greeting[:5])},
   984  }
   985  
   986  func testHelpers(t *testing.T) {
   987  	for _, pair := range testPairs {
   988  		if !reflect.DeepEqual(pair.Got, pair.Want) {
   989  			t.Errorf("%s: got %#v, want %#v", pair.Name, pair.Got, pair.Want)
   990  		}
   991  	}
   992  }
   993  
   994  // basic test cases
   995  
   996  const EINVAL = C.EINVAL /* test #define */
   997  
   998  var KILO = C.KILO
   999  
  1000  func uuidgen() {
  1001  	var uuid C.cgo_uuid_t
  1002  	C.uuid_generate(&uuid[0])
  1003  }
  1004  
  1005  func Strtol(s string, base int) (int, error) {
  1006  	p := C.CString(s)
  1007  	n, err := C.strtol(p, nil, C.int(base))
  1008  	C.free(unsafe.Pointer(p))
  1009  	return int(n), err
  1010  }
  1011  
  1012  func Atol(s string) int {
  1013  	p := C.CString(s)
  1014  	n := C.atol(p)
  1015  	C.free(unsafe.Pointer(p))
  1016  	return int(n)
  1017  }
  1018  
  1019  func testConst(t *testing.T) {
  1020  	C.myConstFunc(nil, 0, nil)
  1021  }
  1022  
  1023  func testEnum(t *testing.T) {
  1024  	if C.Enum1 != 1 || C.Enum2 != 2 {
  1025  		t.Error("bad enum", C.Enum1, C.Enum2)
  1026  	}
  1027  }
  1028  
  1029  func testNamedEnum(t *testing.T) {
  1030  	e := new(C.enum_E)
  1031  
  1032  	*e = C.Enum1
  1033  	if *e != 1 {
  1034  		t.Error("bad enum", C.Enum1)
  1035  	}
  1036  
  1037  	*e = C.Enum2
  1038  	if *e != 2 {
  1039  		t.Error("bad enum", C.Enum2)
  1040  	}
  1041  }
  1042  
  1043  func testCastToEnum(t *testing.T) {
  1044  	e := C.enum_E(C.Enum1)
  1045  	if e != 1 {
  1046  		t.Error("bad enum", C.Enum1)
  1047  	}
  1048  
  1049  	e = C.enum_E(C.Enum2)
  1050  	if e != 2 {
  1051  		t.Error("bad enum", C.Enum2)
  1052  	}
  1053  }
  1054  
  1055  func testAtol(t *testing.T) {
  1056  	l := Atol("123")
  1057  	if l != 123 {
  1058  		t.Error("Atol 123: ", l)
  1059  	}
  1060  }
  1061  
  1062  func testErrno(t *testing.T) {
  1063  	p := C.CString("no-such-file")
  1064  	m := C.CString("r")
  1065  	f, err := C.fopen(p, m)
  1066  	C.free(unsafe.Pointer(p))
  1067  	C.free(unsafe.Pointer(m))
  1068  	if err == nil {
  1069  		C.fclose(f)
  1070  		t.Fatalf("C.fopen: should fail")
  1071  	}
  1072  	if err != syscall.ENOENT {
  1073  		t.Fatalf("C.fopen: unexpected error: %v", err)
  1074  	}
  1075  }
  1076  
  1077  func testMultipleAssign(t *testing.T) {
  1078  	p := C.CString("234")
  1079  	n, m := C.strtol(p, nil, 345), C.strtol(p, nil, 10)
  1080  	if runtime.GOOS == "openbsd" {
  1081  		// Bug in OpenBSD strtol(3) - base > 36 succeeds.
  1082  		if (n != 0 && n != 239089) || m != 234 {
  1083  			t.Fatal("Strtol x2: ", n, m)
  1084  		}
  1085  	} else if n != 0 || m != 234 {
  1086  		t.Fatal("Strtol x2: ", n, m)
  1087  	}
  1088  	C.free(unsafe.Pointer(p))
  1089  }
  1090  
  1091  var (
  1092  	cuint  = (C.uint)(0)
  1093  	culong C.ulong
  1094  	cchar  C.char
  1095  )
  1096  
  1097  type Context struct {
  1098  	ctx *C.struct_ibv_context
  1099  }
  1100  
  1101  func benchCgoCall(b *testing.B) {
  1102  	b.Run("add-int", func(b *testing.B) {
  1103  		const x = C.int(2)
  1104  		const y = C.int(3)
  1105  
  1106  		for i := 0; i < b.N; i++ {
  1107  			C.add(x, y)
  1108  		}
  1109  	})
  1110  
  1111  	b.Run("one-pointer", func(b *testing.B) {
  1112  		var a0 C.VkDeviceCreateInfo
  1113  		for i := 0; i < b.N; i++ {
  1114  			C.handleComplexPointer(&a0)
  1115  		}
  1116  	})
  1117  	b.Run("string-pointer-escape", func(b *testing.B) {
  1118  		for i := 0; i < b.N; i++ {
  1119  			var s string
  1120  			C.handleGoStringPointerEscape(unsafe.Pointer(&s))
  1121  		}
  1122  	})
  1123  	b.Run("string-pointer-noescape", func(b *testing.B) {
  1124  		for i := 0; i < b.N; i++ {
  1125  			var s string
  1126  			C.handleGoStringPointerNoescape(unsafe.Pointer(&s))
  1127  		}
  1128  	})
  1129  	b.Run("eight-pointers", func(b *testing.B) {
  1130  		var a0, a1, a2, a3, a4, a5, a6, a7 C.VkDeviceCreateInfo
  1131  		for i := 0; i < b.N; i++ {
  1132  			C.handleComplexPointer8(&a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7)
  1133  		}
  1134  	})
  1135  	b.Run("eight-pointers-nil", func(b *testing.B) {
  1136  		var a0, a1, a2, a3, a4, a5, a6, a7 *C.VkDeviceCreateInfo
  1137  		for i := 0; i < b.N; i++ {
  1138  			C.handleComplexPointer8(a0, a1, a2, a3, a4, a5, a6, a7)
  1139  		}
  1140  	})
  1141  	b.Run("eight-pointers-array", func(b *testing.B) {
  1142  		var a [8]C.VkDeviceCreateInfo
  1143  		for i := 0; i < b.N; i++ {
  1144  			C.handleComplexPointer8(&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7])
  1145  		}
  1146  	})
  1147  	b.Run("eight-pointers-slice", func(b *testing.B) {
  1148  		a := make([]C.VkDeviceCreateInfo, 8)
  1149  		for i := 0; i < b.N; i++ {
  1150  			C.handleComplexPointer8(&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7])
  1151  		}
  1152  	})
  1153  }
  1154  
  1155  // Benchmark measuring overhead from Go to C and back to Go (via a callback)
  1156  func benchCallback(b *testing.B) {
  1157  	var x = false
  1158  	for i := 0; i < b.N; i++ {
  1159  		nestedCall(func() { x = true })
  1160  	}
  1161  	if !x {
  1162  		b.Fatal("nestedCall was not invoked")
  1163  	}
  1164  }
  1165  
  1166  var sinkString string
  1167  
  1168  func benchGoString(b *testing.B) {
  1169  	for i := 0; i < b.N; i++ {
  1170  		sinkString = C.GoString(C.cstr)
  1171  	}
  1172  	const want = "abcefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890"
  1173  	if sinkString != want {
  1174  		b.Fatalf("%q != %q", sinkString, want)
  1175  	}
  1176  }
  1177  
  1178  // Static (build-time) test that syntax traversal visits all operands of s[i:j:k].
  1179  func sliceOperands(array [2000]int) {
  1180  	_ = array[C.KILO:C.KILO:C.KILO] // no type error
  1181  }
  1182  
  1183  // set in cgo_thread_lock.go init
  1184  var testThreadLockFunc = func(*testing.T) {}
  1185  
  1186  // complex alignment
  1187  
  1188  func TestComplexAlign(t *testing.T) {
  1189  	if C.cplxAlign.x != 3.14 {
  1190  		t.Errorf("got %v, expected 3.14", C.cplxAlign.x)
  1191  	}
  1192  	if C.cplxAlign.y != 2.17 {
  1193  		t.Errorf("got %v, expected 2.17", C.cplxAlign.y)
  1194  	}
  1195  }
  1196  
  1197  // constants and pointer checking
  1198  
  1199  func testCheckConst(t *testing.T) {
  1200  	// The test is that this compiles successfully.
  1201  	p := C.malloc(C.size_t(unsafe.Sizeof(C.int(0))))
  1202  	defer C.free(p)
  1203  	C.CheckConstFunc(&C.CheckConstStruct{(*C.int)(p)}, C.CheckConstVal)
  1204  }
  1205  
  1206  // duplicate symbol
  1207  
  1208  func duplicateSymbols() {
  1209  	fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two)
  1210  }
  1211  
  1212  // environment
  1213  
  1214  // This is really an os package test but here for convenience.
  1215  func testSetEnv(t *testing.T) {
  1216  	if runtime.GOOS == "windows" {
  1217  		// Go uses SetEnvironmentVariable on windows. However,
  1218  		// C runtime takes a *copy* at process startup of the
  1219  		// OS environment, and stores it in environ/envp.
  1220  		// It is this copy that	getenv/putenv manipulate.
  1221  		t.Logf("skipping test")
  1222  		return
  1223  	}
  1224  	const key = "CGO_OS_TEST_KEY"
  1225  	const val = "CGO_OS_TEST_VALUE"
  1226  	os.Setenv(key, val)
  1227  	keyc := C.CString(key)
  1228  	defer C.free(unsafe.Pointer(keyc))
  1229  	v := C.getenv(keyc)
  1230  	if uintptr(unsafe.Pointer(v)) == 0 {
  1231  		t.Fatal("getenv returned NULL")
  1232  	}
  1233  	vs := C.GoString(v)
  1234  	if vs != val {
  1235  		t.Fatalf("getenv() = %q; want %q", vs, val)
  1236  	}
  1237  }
  1238  
  1239  // function pointer variables
  1240  
  1241  func callBridge(f C.intFunc) int {
  1242  	return int(C.bridge_int_func(f))
  1243  }
  1244  
  1245  func callCBridge(f C.intFunc) C.int {
  1246  	return C.bridge_int_func(f)
  1247  }
  1248  
  1249  func testFpVar(t *testing.T) {
  1250  	const expected = 42
  1251  	f := C.intFunc(C.fortytwo)
  1252  	res1 := C.bridge_int_func(f)
  1253  	if r1 := int(res1); r1 != expected {
  1254  		t.Errorf("got %d, want %d", r1, expected)
  1255  	}
  1256  	res2 := callCBridge(f)
  1257  	if r2 := int(res2); r2 != expected {
  1258  		t.Errorf("got %d, want %d", r2, expected)
  1259  	}
  1260  	r3 := callBridge(f)
  1261  	if r3 != expected {
  1262  		t.Errorf("got %d, want %d", r3, expected)
  1263  	}
  1264  }
  1265  
  1266  // issue 1222
  1267  type AsyncEvent struct {
  1268  	event C.struct_ibv_async_event
  1269  }
  1270  
  1271  // issue 1635
  1272  
  1273  func test1635(t *testing.T) {
  1274  	C.scatter()
  1275  	if v := C.hola; v != 0 {
  1276  		t.Fatalf("C.hola is %d, should be 0", v)
  1277  	}
  1278  	if v := C.testHola(); v != 0 {
  1279  		t.Fatalf("C.testHola() is %d, should be 0", v)
  1280  	}
  1281  }
  1282  
  1283  // issue 2470
  1284  
  1285  func testUnsignedInt(t *testing.T) {
  1286  	a := (int64)(C.UINT32VAL)
  1287  	b := (int64)(0xc008427b)
  1288  	if a != b {
  1289  		t.Errorf("Incorrect unsigned int - got %x, want %x", a, b)
  1290  	}
  1291  }
  1292  
  1293  // issue 3250
  1294  
  1295  func test3250(t *testing.T) {
  1296  	if runtime.GOOS == "windows" {
  1297  		t.Skip("not applicable on windows")
  1298  	}
  1299  
  1300  	t.Skip("skipped, see golang.org/issue/5885")
  1301  	var (
  1302  		thres = 1
  1303  		sig   = syscall_dot_SIGCHLD
  1304  	)
  1305  	type result struct {
  1306  		n   int
  1307  		sig os.Signal
  1308  	}
  1309  	var (
  1310  		sigCh     = make(chan os.Signal, 10)
  1311  		waitStart = make(chan struct{})
  1312  		waitDone  = make(chan result)
  1313  	)
  1314  
  1315  	signal.Notify(sigCh, sig)
  1316  
  1317  	go func() {
  1318  		n := 0
  1319  		alarm := time.After(time.Second * 3)
  1320  		for {
  1321  			select {
  1322  			case <-waitStart:
  1323  				waitStart = nil
  1324  			case v := <-sigCh:
  1325  				n++
  1326  				if v != sig || n > thres {
  1327  					waitDone <- result{n, v}
  1328  					return
  1329  				}
  1330  			case <-alarm:
  1331  				waitDone <- result{n, sig}
  1332  				return
  1333  			}
  1334  		}
  1335  	}()
  1336  
  1337  	waitStart <- struct{}{}
  1338  	C.testSendSIG()
  1339  	r := <-waitDone
  1340  	if r.sig != sig {
  1341  		t.Fatalf("received signal %v, but want %v", r.sig, sig)
  1342  	}
  1343  	t.Logf("got %d signals\n", r.n)
  1344  	if r.n <= thres {
  1345  		t.Fatalf("expected more than %d", thres)
  1346  	}
  1347  }
  1348  
  1349  // issue 3261
  1350  
  1351  func testLibgcc(t *testing.T) {
  1352  	var table = []struct {
  1353  		in, out C.int
  1354  	}{
  1355  		{0, 0},
  1356  		{1, 1},
  1357  		{-42, 42},
  1358  		{1000300, 1000300},
  1359  		{1 - 1<<31, 1<<31 - 1},
  1360  	}
  1361  	for _, v := range table {
  1362  		if o := C.vabs(v.in); o != v.out {
  1363  			t.Fatalf("abs(%d) got %d, should be %d", v.in, o, v.out)
  1364  			return
  1365  		}
  1366  	}
  1367  }
  1368  
  1369  // issue 3729
  1370  
  1371  func test3729(t *testing.T) {
  1372  	if runtime.GOOS == "windows" {
  1373  		t.Skip("skipping on windows")
  1374  	}
  1375  
  1376  	_, e := C.g()
  1377  	if e != syscall.E2BIG {
  1378  		t.Errorf("got %q, expect %q", e, syscall.E2BIG)
  1379  	}
  1380  	_, e = C.g2(C.EINVAL, C._expA, C._expB, C._expC, C._expD)
  1381  	if e != syscall.EINVAL {
  1382  		t.Errorf("got %q, expect %q", e, syscall.EINVAL)
  1383  	}
  1384  }
  1385  
  1386  // issue 3945
  1387  
  1388  func testPrintf(t *testing.T) {
  1389  	C.say()
  1390  }
  1391  
  1392  // issue 4054
  1393  
  1394  var issue4054a = []int{C.A, C.B, C.C, C.D, C.E, C.F, C.G, C.H, C.I, C.J}
  1395  
  1396  // issue 4339
  1397  
  1398  func test4339(t *testing.T) {
  1399  	C.handle4339(&C.exported4339)
  1400  }
  1401  
  1402  // issue 4417
  1403  
  1404  func testBoolAlign(t *testing.T) {
  1405  	b := C.c_bool(true, true, 10, true, false)
  1406  	if b != 10 {
  1407  		t.Fatalf("found %d expected 10\n", b)
  1408  	}
  1409  	b = C.c_bool(true, true, 5, true, true)
  1410  	if b != 5 {
  1411  		t.Fatalf("found %d expected 5\n", b)
  1412  	}
  1413  	b = C.c_bool(true, true, 3, true, false)
  1414  	if b != 3 {
  1415  		t.Fatalf("found %d expected 3\n", b)
  1416  	}
  1417  	b = C.c_bool(false, false, 1, true, false)
  1418  	if b != 1 {
  1419  		t.Fatalf("found %d expected 1\n", b)
  1420  	}
  1421  	b = C.c_bool(false, true, 200, true, false)
  1422  	if b != 200 {
  1423  		t.Fatalf("found %d expected 200\n", b)
  1424  	}
  1425  }
  1426  
  1427  // issue 4857
  1428  
  1429  func test4857() {
  1430  	_ = C.issue4857()
  1431  }
  1432  
  1433  // issue 5224
  1434  
  1435  func testCflags(t *testing.T) {
  1436  	is_windows := C.is_windows == 1
  1437  	if is_windows != (runtime.GOOS == "windows") {
  1438  		t.Errorf("is_windows: %v, runtime.GOOS: %s", is_windows, runtime.GOOS)
  1439  	}
  1440  	if C.common != 123 {
  1441  		t.Errorf("common: %v (expected 123)", C.common)
  1442  	}
  1443  }
  1444  
  1445  // issue 5227
  1446  
  1447  func test5227(t *testing.T) {
  1448  	C.init()
  1449  }
  1450  
  1451  func selectfont() C.Fontinfo {
  1452  	return C.SansTypeface
  1453  }
  1454  
  1455  // issue 5242
  1456  
  1457  func test5242(t *testing.T) {
  1458  	if got := C.issue5242(C.foo{}, C.bar{}); got != 5242 {
  1459  		t.Errorf("got %v", got)
  1460  	}
  1461  }
  1462  
  1463  func test5603(t *testing.T) {
  1464  	var x [5]int64
  1465  	exp := int64(C.issue5603exp)
  1466  	x[0] = int64(C.issue5603foo0())
  1467  	x[1] = int64(C.issue5603foo1(nil))
  1468  	x[2] = int64(C.issue5603foo2(nil, nil))
  1469  	x[3] = int64(C.issue5603foo3(nil, nil, nil))
  1470  	x[4] = int64(C.issue5603foo4(nil, nil, nil, nil))
  1471  	for i, v := range x {
  1472  		if v != exp {
  1473  			t.Errorf("issue5603foo%d() returns %v, expected %v", i, v, exp)
  1474  		}
  1475  	}
  1476  }
  1477  
  1478  // issue 5337
  1479  
  1480  func test5337(t *testing.T) {
  1481  	C.test5337()
  1482  }
  1483  
  1484  // issue 5740
  1485  
  1486  func test5740(t *testing.T) {
  1487  	if v := C.test5740a() + C.test5740b(); v != 5 {
  1488  		t.Errorf("expected 5, got %v", v)
  1489  	}
  1490  }
  1491  
  1492  // issue 5986
  1493  
  1494  func test5986(t *testing.T) {
  1495  	C.output5986()
  1496  }
  1497  
  1498  // issue 6128
  1499  
  1500  func test6128() {
  1501  	// nothing to run, just make sure this compiles.
  1502  	_ = C.X
  1503  }
  1504  
  1505  // issue 6390
  1506  
  1507  func test6390(t *testing.T) {
  1508  	p1 := C.malloc(1024)
  1509  	if p1 == nil {
  1510  		t.Fatalf("C.malloc(1024) returned nil")
  1511  	}
  1512  	p2 := C.malloc(0)
  1513  	if p2 == nil {
  1514  		t.Fatalf("C.malloc(0) returned nil")
  1515  	}
  1516  	C.free(p1)
  1517  	C.free(p2)
  1518  }
  1519  
  1520  func test6472() {
  1521  	// nothing to run, just make sure this compiles
  1522  	s := new(C.z)
  1523  	println(s.y[0].x)
  1524  }
  1525  
  1526  // issue 6506
  1527  
  1528  func test6506() {
  1529  	// nothing to run, just make sure this compiles
  1530  	var x C.size_t
  1531  
  1532  	C.calloc(x, x)
  1533  	C.malloc(x)
  1534  	C.realloc(nil, x)
  1535  	C.memcpy(nil, nil, x)
  1536  	C.memcmp(nil, nil, x)
  1537  	C.memmove(nil, nil, x)
  1538  	C.strncpy(nil, nil, x)
  1539  	C.strncmp(nil, nil, x)
  1540  	C.strncat(nil, nil, x)
  1541  	x = C.strxfrm(nil, nil, x)
  1542  	C.memchr(nil, 0, x)
  1543  	x = C.strcspn(nil, nil)
  1544  	x = C.strspn(nil, nil)
  1545  	C.memset(nil, 0, x)
  1546  	x = C.strlen(nil)
  1547  	_ = x
  1548  }
  1549  
  1550  // issue 6612
  1551  
  1552  func testNaming(t *testing.T) {
  1553  	C.myfunc()
  1554  	C.myfunc_def()
  1555  	if v := C.myvar; v != 5 {
  1556  		t.Errorf("C.myvar = %d, want 5", v)
  1557  	}
  1558  	if v := C.myvar_def; v != 5 {
  1559  		t.Errorf("C.myvar_def = %d, want 5", v)
  1560  	}
  1561  	if s := C.GoString(C.mytext); s != "abcdef" {
  1562  		t.Errorf("C.mytext = %q, want %q", s, "abcdef")
  1563  	}
  1564  	if s := C.GoString(C.mytext_def); s != "abcdef" {
  1565  		t.Errorf("C.mytext_def = %q, want %q", s, "abcdef")
  1566  	}
  1567  	if c := C.myenum; c != 1234 {
  1568  		t.Errorf("C.myenum = %v, want 1234", c)
  1569  	}
  1570  	if c := C.myenum_def; c != 1234 {
  1571  		t.Errorf("C.myenum_def = %v, want 1234", c)
  1572  	}
  1573  	{
  1574  		const c = C.myenum
  1575  		if c != 1234 {
  1576  			t.Errorf("C.myenum as const = %v, want 1234", c)
  1577  		}
  1578  	}
  1579  	{
  1580  		const c = C.myenum_def
  1581  		if c != 1234 {
  1582  			t.Errorf("C.myenum as const = %v, want 1234", c)
  1583  		}
  1584  	}
  1585  	if c := C.myint_def; c != 12345 {
  1586  		t.Errorf("C.myint_def = %v, want 12345", c)
  1587  	}
  1588  	{
  1589  		const c = C.myint_def
  1590  		if c != 12345 {
  1591  			t.Errorf("C.myint as const = %v, want 12345", c)
  1592  		}
  1593  	}
  1594  
  1595  	if c := C.myfloat_def; c != 1.5 {
  1596  		t.Errorf("C.myint_def = %v, want 1.5", c)
  1597  	}
  1598  	{
  1599  		const c = C.myfloat_def
  1600  		if c != 1.5 {
  1601  			t.Errorf("C.myint as const = %v, want 1.5", c)
  1602  		}
  1603  	}
  1604  
  1605  	if s := C.mystring_def; s != "hello" {
  1606  		t.Errorf("C.mystring_def = %q, want %q", s, "hello")
  1607  	}
  1608  }
  1609  
  1610  // issue 6907
  1611  
  1612  func test6907(t *testing.T) {
  1613  	want := "yarn"
  1614  	if got := C.GoString(C.Issue6907CopyString(want)); got != want {
  1615  		t.Errorf("C.GoString(C.Issue6907CopyString(%q)) == %q, want %q", want, got, want)
  1616  	}
  1617  }
  1618  
  1619  // issue 7560
  1620  
  1621  func test7560(t *testing.T) {
  1622  	// some mingw don't implement __packed__ correctly.
  1623  	if C.offset7560() != 1 {
  1624  		t.Skip("C compiler did not pack struct")
  1625  	}
  1626  
  1627  	// C.misaligned should have x but then a padding field to get to the end of the struct.
  1628  	// There should not be a field named 'y'.
  1629  	var v C.misaligned
  1630  	rt := reflect.TypeOf(&v).Elem()
  1631  	if rt.NumField() != 2 || rt.Field(0).Name != "x" || rt.Field(1).Name != "_" {
  1632  		t.Errorf("unexpected fields in C.misaligned:\n")
  1633  		for i := 0; i < rt.NumField(); i++ {
  1634  			t.Logf("%+v\n", rt.Field(i))
  1635  		}
  1636  	}
  1637  }
  1638  
  1639  // issue 7786
  1640  
  1641  func f() {
  1642  	var x1 *C.typedef_test7786
  1643  	var x2 *C.struct_test7786
  1644  	x1 = x2
  1645  	x2 = x1
  1646  	C.f7786(x1)
  1647  	C.f7786(x2)
  1648  	C.g7786(x1)
  1649  	C.g7786(x2)
  1650  
  1651  	var b1 *C.typedef_body7786
  1652  	var b2 *C.struct_body7786
  1653  	b1 = b2
  1654  	b2 = b1
  1655  	C.b7786(b1)
  1656  	C.b7786(b2)
  1657  	C.c7786(b1)
  1658  	C.c7786(b2)
  1659  
  1660  	var u1 *C.typedef_union7786
  1661  	var u2 *C.union_union7786
  1662  	u1 = u2
  1663  	u2 = u1
  1664  	C.u7786(u1)
  1665  	C.u7786(u2)
  1666  	C.v7786(u1)
  1667  	C.v7786(u2)
  1668  }
  1669  
  1670  // issue 8092
  1671  
  1672  func test8092(t *testing.T) {
  1673  	tests := []struct {
  1674  		s    string
  1675  		a, b *C.char
  1676  	}{
  1677  		{"text", &C.text[0], C.ctext()},
  1678  		{"data", &C.data[0], C.cdata()},
  1679  	}
  1680  	for _, test := range tests {
  1681  		if test.a != test.b {
  1682  			t.Errorf("%s: pointer mismatch: %v != %v", test.s, test.a, test.b)
  1683  		}
  1684  		if got := C.GoString(test.a); got != test.s {
  1685  			t.Errorf("%s: points at %#v, want %#v", test.s, got, test.s)
  1686  		}
  1687  	}
  1688  }
  1689  
  1690  // issues 8368 and 8441
  1691  
  1692  func issue8368(one *C.struct_one, two *C.struct_two) {
  1693  }
  1694  
  1695  func issue8441(one *C.one, two *C.two) {
  1696  	issue8441(two.x, one.x)
  1697  }
  1698  
  1699  // issue 8428
  1700  
  1701  var _ = C.struct_issue8428one{
  1702  	b: C.char(0),
  1703  	// The trailing rest field is not available in cgo.
  1704  	// See issue 11925.
  1705  	// rest: [0]C.char{},
  1706  }
  1707  
  1708  var _ = C.struct_issue8428two{
  1709  	p:    unsafe.Pointer(nil),
  1710  	b:    C.char(0),
  1711  	rest: [0]C.char{},
  1712  }
  1713  
  1714  var _ = C.struct_issue8428three{
  1715  	w: [1][2][3][0]C.char{},
  1716  	x: [2][3][0][1]C.char{},
  1717  	y: [3][0][1][2]C.char{},
  1718  	z: [0][1][2][3]C.char{},
  1719  }
  1720  
  1721  // issue 8811
  1722  
  1723  func test8811(t *testing.T) {
  1724  	C.issue8811Execute()
  1725  }
  1726  
  1727  // issue 9557
  1728  
  1729  func test9557(t *testing.T) {
  1730  	// implicitly dereference a Go variable
  1731  	foo := C.issue9557foo
  1732  	if v := foo.a; v != 42 {
  1733  		t.Fatalf("foo.a expected 42, but got %d", v)
  1734  	}
  1735  
  1736  	// explicitly dereference a C variable
  1737  	if v := (*C.issue9557foo).a; v != 42 {
  1738  		t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
  1739  	}
  1740  
  1741  	// implicitly dereference a C variable
  1742  	if v := C.issue9557foo.a; v != 42 {
  1743  		t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
  1744  	}
  1745  }
  1746  
  1747  // issue 8331 part 1
  1748  
  1749  func issue8331a() C.issue8331 {
  1750  	return issue8331Var
  1751  }
  1752  
  1753  // issue 10303
  1754  
  1755  func test10303(t *testing.T, n int) {
  1756  	if runtime.Compiler == "gccgo" {
  1757  		t.Skip("gccgo permits C pointers on the stack")
  1758  	}
  1759  
  1760  	// Run at a few different stack depths just to avoid an unlucky pass
  1761  	// due to variables ending up on different pages.
  1762  	if n > 0 {
  1763  		test10303(t, n-1)
  1764  	}
  1765  	if t.Failed() {
  1766  		return
  1767  	}
  1768  	var x, y, z, v, si C.int
  1769  	var s C.Struct
  1770  	C.setintstar(&x)
  1771  	C.setintptr(&y)
  1772  	C.setvoidptr(unsafe.Pointer(&v))
  1773  	s.P = &si
  1774  	C.setstruct(s)
  1775  
  1776  	if uintptr(unsafe.Pointer(&x))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
  1777  		t.Error("C int* argument on stack")
  1778  	}
  1779  	if uintptr(unsafe.Pointer(&y))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
  1780  		t.Error("C intptr argument on stack")
  1781  	}
  1782  	if uintptr(unsafe.Pointer(&v))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
  1783  		t.Error("C void* argument on stack")
  1784  	}
  1785  	if uintptr(unsafe.Pointer(&si))&^0xfff == uintptr(unsafe.Pointer(&z))&^0xfff {
  1786  		t.Error("C struct field pointer on stack")
  1787  	}
  1788  }
  1789  
  1790  // issue 11925
  1791  
  1792  func test11925(t *testing.T) {
  1793  	if C.sizeof_struct_a11925 != unsafe.Sizeof(C.struct_a11925{}) {
  1794  		t.Errorf("size of a changed: C %d, Go %d", C.sizeof_struct_a11925, unsafe.Sizeof(C.struct_a11925{}))
  1795  	}
  1796  	if C.sizeof_struct_b11925 != unsafe.Sizeof(C.struct_b11925{}) {
  1797  		t.Errorf("size of b changed: C %d, Go %d", C.sizeof_struct_b11925, unsafe.Sizeof(C.struct_b11925{}))
  1798  	}
  1799  }
  1800  
  1801  // issue 12030
  1802  
  1803  func test12030(t *testing.T) {
  1804  	buf := (*C.char)(C.malloc(256))
  1805  	defer C.free(unsafe.Pointer(buf))
  1806  	for _, f := range []float64{1.0, 2.0, 3.14} {
  1807  		C.issue12030conv(buf, C.double(f))
  1808  		got := C.GoString(buf)
  1809  		if want := fmt.Sprintf("d=%g", f); got != want {
  1810  			t.Fatalf("C.sprintf failed for %g: %q != %q", f, got, want)
  1811  		}
  1812  	}
  1813  }
  1814  
  1815  // issue 13402
  1816  
  1817  var _ C.complexfloat
  1818  var _ C.complexdouble
  1819  
  1820  // issue 13930
  1821  // Test that cgo's multiple-value special form for
  1822  // C function calls works in variable declaration statements.
  1823  
  1824  var _, _ = C.abs(0)
  1825  
  1826  // issue 14838
  1827  
  1828  func test14838(t *testing.T) {
  1829  	data := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
  1830  	cData := C.CBytes(data)
  1831  	defer C.free(cData)
  1832  
  1833  	if C.check_cbytes((*C.char)(cData), C.size_t(len(data))) == 0 {
  1834  		t.Fatalf("mismatched data: expected %v, got %v", data, (*(*[10]byte)(unsafe.Pointer(cData)))[:])
  1835  	}
  1836  }
  1837  
  1838  // issue 17065
  1839  
  1840  var sink C.int
  1841  
  1842  func test17065(t *testing.T) {
  1843  	if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
  1844  		t.Skip("broken on darwin; issue 17065")
  1845  	}
  1846  	for i := range C.ii {
  1847  		sink = C.ii[i]
  1848  	}
  1849  }
  1850  
  1851  // issue 17537
  1852  
  1853  func test17537(t *testing.T) {
  1854  	v := C.S17537{i: 17537}
  1855  	if got, want := C.I17537(&v), C.int(17537); got != want {
  1856  		t.Errorf("got %d, want %d", got, want)
  1857  	}
  1858  
  1859  	p := (*C.char)(C.malloc(1))
  1860  	*p = 17
  1861  	if got, want := C.F17537(&p), C.int(17); got != want {
  1862  		t.Errorf("got %d, want %d", got, want)
  1863  	}
  1864  
  1865  	C.F18298(nil)
  1866  	var v18298 C.T18298_2
  1867  	C.G18298(C.T18298_1(v18298))
  1868  }
  1869  
  1870  // issue 17723
  1871  
  1872  func testAPI() {
  1873  	var cs *C.char
  1874  	cs = C.CString("hello")
  1875  	defer C.free(unsafe.Pointer(cs))
  1876  	var s string
  1877  	s = C.GoString((*C.char)(C.api_hello))
  1878  	s = C.GoStringN((*C.char)(C.api_hello), C.int(6))
  1879  	var b []byte
  1880  	b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6))
  1881  	_, _ = s, b
  1882  	C.cstring_pointer_fun(nil)
  1883  }
  1884  
  1885  // issue 18126
  1886  
  1887  func test18126(t *testing.T) {
  1888  	p := C.malloc(1)
  1889  	_, err := C.Issue18126C(&p)
  1890  	C.free(p)
  1891  	_ = err
  1892  }
  1893  
  1894  // issue 18720
  1895  
  1896  func test18720(t *testing.T) {
  1897  	if got, want := C.HELLO_WORLD, "hello\000world"; got != want {
  1898  		t.Errorf("C.HELLO_WORLD == %q, expected %q", got, want)
  1899  	}
  1900  
  1901  	if got, want := C.VAR1, C.int(5); got != want {
  1902  		t.Errorf("C.VAR1 == %v, expected %v", got, want)
  1903  	}
  1904  
  1905  	if got, want := *C.ADDR, C.int(5); got != want {
  1906  		t.Errorf("*C.ADDR == %v, expected %v", got, want)
  1907  	}
  1908  
  1909  	if got, want := C.CALL, C.int(6); got != want {
  1910  		t.Errorf("C.CALL == %v, expected %v", got, want)
  1911  	}
  1912  
  1913  	if got, want := C.CALL, C.int(7); got != want {
  1914  		t.Errorf("C.CALL == %v, expected %v", got, want)
  1915  	}
  1916  
  1917  	// Issue 20125.
  1918  	if got, want := C.SIZE_OF_FOO, 1; got != want {
  1919  		t.Errorf("C.SIZE_OF_FOO == %v, expected %v", got, want)
  1920  	}
  1921  }
  1922  
  1923  // issue 20129
  1924  
  1925  func test20129(t *testing.T) {
  1926  	if C.issue20129 != 0 {
  1927  		t.Fatal("test is broken")
  1928  	}
  1929  	C.issue20129Foo()
  1930  	if C.issue20129 != 1 {
  1931  		t.Errorf("got %v but expected %v", C.issue20129, 1)
  1932  	}
  1933  	C.issue20129Bar()
  1934  	if C.issue20129 != 2 {
  1935  		t.Errorf("got %v but expected %v", C.issue20129, 2)
  1936  	}
  1937  }
  1938  
  1939  // issue 20369
  1940  
  1941  func test20369(t *testing.T) {
  1942  	if C.XUINT64_MAX != math.MaxUint64 {
  1943  		t.Fatalf("got %v, want %v", uint64(C.XUINT64_MAX), uint64(math.MaxUint64))
  1944  	}
  1945  }
  1946  
  1947  // issue 21668
  1948  
  1949  var issue21668_X = C.x21668
  1950  
  1951  // issue 21708
  1952  
  1953  func test21708(t *testing.T) {
  1954  	if got, want := C.CAST_TO_INT64, -1; got != want {
  1955  		t.Errorf("C.CAST_TO_INT64 == %v, expected %v", got, want)
  1956  	}
  1957  }
  1958  
  1959  // issue 21809
  1960  
  1961  func test21809(t *testing.T) {
  1962  	longVar := C.long(3)
  1963  	typedefVar := C.MySigned_t(4)
  1964  	typedefTypedefVar := C.MySigned2_t(5)
  1965  
  1966  	// all three should be considered identical to `long`
  1967  	if ret := C.takes_long(longVar); ret != 9 {
  1968  		t.Errorf("got %v but expected %v", ret, 9)
  1969  	}
  1970  	if ret := C.takes_long(typedefVar); ret != 16 {
  1971  		t.Errorf("got %v but expected %v", ret, 16)
  1972  	}
  1973  	if ret := C.takes_long(typedefTypedefVar); ret != 25 {
  1974  		t.Errorf("got %v but expected %v", ret, 25)
  1975  	}
  1976  
  1977  	// They should also be identical to the typedef'd type
  1978  	if ret := C.takes_typedef(longVar); ret != 9 {
  1979  		t.Errorf("got %v but expected %v", ret, 9)
  1980  	}
  1981  	if ret := C.takes_typedef(typedefVar); ret != 16 {
  1982  		t.Errorf("got %v but expected %v", ret, 16)
  1983  	}
  1984  	if ret := C.takes_typedef(typedefTypedefVar); ret != 25 {
  1985  		t.Errorf("got %v but expected %v", ret, 25)
  1986  	}
  1987  }
  1988  
  1989  // issue 22906
  1990  
  1991  func test22906(t *testing.T) {
  1992  	var x1 C.jobject = 0 // Note: 0, not nil. That makes sure we use uintptr for these types.
  1993  	_ = x1
  1994  	var x2 C.jclass = 0
  1995  	_ = x2
  1996  	var x3 C.jthrowable = 0
  1997  	_ = x3
  1998  	var x4 C.jstring = 0
  1999  	_ = x4
  2000  	var x5 C.jarray = 0
  2001  	_ = x5
  2002  	var x6 C.jbooleanArray = 0
  2003  	_ = x6
  2004  	var x7 C.jbyteArray = 0
  2005  	_ = x7
  2006  	var x8 C.jcharArray = 0
  2007  	_ = x8
  2008  	var x9 C.jshortArray = 0
  2009  	_ = x9
  2010  	var x10 C.jintArray = 0
  2011  	_ = x10
  2012  	var x11 C.jlongArray = 0
  2013  	_ = x11
  2014  	var x12 C.jfloatArray = 0
  2015  	_ = x12
  2016  	var x13 C.jdoubleArray = 0
  2017  	_ = x13
  2018  	var x14 C.jobjectArray = 0
  2019  	_ = x14
  2020  	var x15 C.jweak = 0
  2021  	_ = x15
  2022  }
  2023  
  2024  // issue 22958
  2025  // Nothing to run, just make sure this compiles.
  2026  var Vissue22958 C.issue22958Type
  2027  
  2028  func test23356(t *testing.T) {
  2029  	if got, want := C.a(), C.int(5); got != want {
  2030  		t.Errorf("C.a() == %v, expected %v", got, want)
  2031  	}
  2032  	if got, want := C.r(), C.int(3); got != want {
  2033  		t.Errorf("C.r() == %v, expected %v", got, want)
  2034  	}
  2035  }
  2036  
  2037  // issue 23720
  2038  
  2039  func Issue23720F() {
  2040  	var x C.issue23720A
  2041  	C.issue23720F(x)
  2042  }
  2043  
  2044  // issue 24206
  2045  
  2046  func test24206(t *testing.T) {
  2047  	if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
  2048  		t.Skipf("skipping on %s/%s", runtime.GOOS, runtime.GOARCH)
  2049  	}
  2050  
  2051  	if l := len(C.GoString(C.dangerousString1())); l != 123 {
  2052  		t.Errorf("Incorrect string length - got %d, want 123", l)
  2053  	}
  2054  	if l := len(C.GoString(C.dangerousString2())); l != 4096+123 {
  2055  		t.Errorf("Incorrect string length - got %d, want %d", l, 4096+123)
  2056  	}
  2057  }
  2058  
  2059  // issue 25143
  2060  
  2061  func issue25143sum(ns ...C.int) C.int {
  2062  	total := C.int(0)
  2063  	for _, n := range ns {
  2064  		total += n
  2065  	}
  2066  	return total
  2067  }
  2068  
  2069  func test25143(t *testing.T) {
  2070  	if got, want := issue25143sum(1, 2, 3), C.int(6); got != want {
  2071  		t.Errorf("issue25143sum(1, 2, 3) == %v, expected %v", got, want)
  2072  	}
  2073  }
  2074  
  2075  // issue 26066
  2076  // Wrong type of constant with GCC 8 and newer.
  2077  
  2078  func test26066(t *testing.T) {
  2079  	var i = int64(C.issue26066)
  2080  	if i != -1 {
  2081  		t.Errorf("got %d, want -1", i)
  2082  	}
  2083  }
  2084  
  2085  // issue 26517
  2086  var a C.TypeOne
  2087  var b C.TypeTwo
  2088  
  2089  // issue 27660
  2090  // Stress the interaction between the race detector and cgo in an
  2091  // attempt to reproduce the memory corruption described in #27660.
  2092  // The bug was very timing sensitive; at the time of writing this
  2093  // test would only trigger the bug about once out of every five runs.
  2094  
  2095  func test27660(t *testing.T) {
  2096  	ctx, cancel := context.WithCancel(context.Background())
  2097  	defer cancel()
  2098  	ints := make([]int, 100)
  2099  	locks := make([]sync.Mutex, 100)
  2100  	// Slowly create threads so that ThreadSanitizer is forced to
  2101  	// frequently resize its SyncClocks.
  2102  	for i := 0; i < 100; i++ {
  2103  		go func() {
  2104  			for ctx.Err() == nil {
  2105  				// Sleep in C for long enough that it is likely that the runtime
  2106  				// will retake this goroutine's currently wired P.
  2107  				C.usleep(1000 /* 1ms */)
  2108  				runtime.Gosched() // avoid starvation (see #28701)
  2109  			}
  2110  		}()
  2111  		go func() {
  2112  			// Trigger lots of synchronization and memory reads/writes to
  2113  			// increase the likelihood that the race described in #27660
  2114  			// results in corruption of ThreadSanitizer's internal state
  2115  			// and thus an assertion failure or segfault.
  2116  			i := 0
  2117  			for ctx.Err() == nil {
  2118  				j := rand.Intn(100)
  2119  				locks[j].Lock()
  2120  				ints[j]++
  2121  				locks[j].Unlock()
  2122  				// needed for gccgo, to avoid creation of an
  2123  				// unpreemptible "fast path" in this loop. Choice
  2124  				// of (1<<24) is somewhat arbitrary.
  2125  				if i%(1<<24) == 0 {
  2126  					runtime.Gosched()
  2127  				}
  2128  				i++
  2129  
  2130  			}
  2131  		}()
  2132  		time.Sleep(time.Millisecond)
  2133  	}
  2134  }
  2135  
  2136  // issue 28540
  2137  
  2138  func twoargsF() {
  2139  	var v struct{ p *byte }
  2140  	C.twoargs1(C.twoargs2(), C.twoargs3(unsafe.Pointer(&v)))
  2141  }
  2142  
  2143  // issue 28545
  2144  
  2145  func issue28545G(p **C.char) {
  2146  	C.issue28545F(p, -1, (0))
  2147  	C.issue28545F(p, 2+3, complex(1, 1))
  2148  	C.issue28545F(p, issue28772Constant, issue28772Constant2)
  2149  }
  2150  
  2151  // issue 28772 part 1 - part 2 in testx.go
  2152  
  2153  const issue28772Constant = C.issue28772Constant
  2154  
  2155  // issue 28896
  2156  
  2157  func offset(i int) uintptr {
  2158  	var pi C.innerPacked
  2159  	var po C.outerPacked
  2160  	var ui C.innerUnpacked
  2161  	var uo C.outerUnpacked
  2162  	switch i {
  2163  	case 0:
  2164  		return unsafe.Offsetof(pi.f2)
  2165  	case 1:
  2166  		return unsafe.Offsetof(po.g2)
  2167  	case 2:
  2168  		return unsafe.Offsetof(ui.f2)
  2169  	case 3:
  2170  		return unsafe.Offsetof(uo.g2)
  2171  	default:
  2172  		panic("can't happen")
  2173  	}
  2174  }
  2175  
  2176  func test28896(t *testing.T) {
  2177  	for i := 0; i < 4; i++ {
  2178  		c := uintptr(C.offset(C.int(i)))
  2179  		g := offset(i)
  2180  		if c != g {
  2181  			t.Errorf("%d: C: %d != Go %d", i, c, g)
  2182  		}
  2183  	}
  2184  }
  2185  
  2186  // issue 29383
  2187  // cgo's /*line*/ comments failed when inserted after '/',
  2188  // because the result looked like a "//" comment.
  2189  // No runtime test; just make sure it compiles.
  2190  
  2191  func Issue29383(n, size uint) int {
  2192  	if ^C.size_t(0)/C.size_t(n) < C.size_t(size) {
  2193  		return 0
  2194  	}
  2195  	return 0
  2196  }
  2197  
  2198  // issue 29748
  2199  // Error handling a struct initializer that requires pointer checking.
  2200  // Compilation test only, nothing to run.
  2201  
  2202  var Vissue29748 = C.f29748(&C.S29748{
  2203  	nil,
  2204  })
  2205  
  2206  func Fissue299748() {
  2207  	C.f29748(&C.S29748{
  2208  		nil,
  2209  	})
  2210  }
  2211  
  2212  // issue 29781
  2213  
  2214  var issue29781X struct{ X int }
  2215  
  2216  func issue29781F(...int) int { return 0 }
  2217  
  2218  func issue29781G() {
  2219  	var p *C.char
  2220  	C.issue29781F(&p, C.ISSUE29781C+1)
  2221  	C.issue29781F(nil, (C.int)(
  2222  		0))
  2223  	C.issue29781F(&p, (C.int)(0))
  2224  	C.issue29781F(&p, (C.int)(
  2225  		0))
  2226  	C.issue29781F(&p, (C.int)(issue29781X.
  2227  		X))
  2228  }
  2229  
  2230  // issue 30065
  2231  
  2232  func test30065(t *testing.T) {
  2233  	var a [256]byte
  2234  	b := []byte("a")
  2235  	C.memcpy(unsafe.Pointer(&a), unsafe.Pointer(&b[0]), 1)
  2236  	if a[0] != 'a' {
  2237  		t.Errorf("&a failed: got %c, want %c", a[0], 'a')
  2238  	}
  2239  
  2240  	b = []byte("b")
  2241  	C.memcpy(unsafe.Pointer(&a[0]), unsafe.Pointer(&b[0]), 1)
  2242  	if a[0] != 'b' {
  2243  		t.Errorf("&a[0] failed: got %c, want %c", a[0], 'b')
  2244  	}
  2245  
  2246  	d := make([]byte, 256)
  2247  	b = []byte("c")
  2248  	C.memcpy(unsafe.Pointer(&d[0]), unsafe.Pointer(&b[0]), 1)
  2249  	if d[0] != 'c' {
  2250  		t.Errorf("&d[0] failed: got %c, want %c", d[0], 'c')
  2251  	}
  2252  }
  2253  
  2254  // issue 31093
  2255  // No runtime test; just make sure it compiles.
  2256  
  2257  func Issue31093() {
  2258  	C.issue31093F(C.ushort(0))
  2259  }
  2260  
  2261  // issue 32579
  2262  
  2263  func test32579(t *testing.T) {
  2264  	var s [1]C.struct_S32579
  2265  	C.memset(unsafe.Pointer(&s[0].data[0]), 1, 1)
  2266  	if s[0].data[0] != 1 {
  2267  		t.Errorf("&s[0].data[0] failed: got %d, want %d", s[0].data[0], 1)
  2268  	}
  2269  }
  2270  
  2271  // issue 37033, check if cgo.Handle works properly
  2272  
  2273  func testHandle(t *testing.T) {
  2274  	ch := make(chan int)
  2275  
  2276  	for i := 0; i < 42; i++ {
  2277  		h := cgo.NewHandle(ch)
  2278  		go func() {
  2279  			C.cFunc37033(C.uintptr_t(h))
  2280  		}()
  2281  		if v := <-ch; issue37033 != v {
  2282  			t.Fatalf("unexpected receiving value: got %d, want %d", v, issue37033)
  2283  		}
  2284  		h.Delete()
  2285  	}
  2286  }
  2287  
  2288  // issue 38649
  2289  
  2290  var issue38649 C.netbsd_gid = 42
  2291  
  2292  // issue 39877
  2293  
  2294  var issue39877 *C.void = nil
  2295  
  2296  // issue 40494
  2297  // No runtime test; just make sure it compiles.
  2298  
  2299  func Issue40494() {
  2300  	C.issue40494(C.enum_Enum40494(C.X_40494), (*C.union_Union40494)(nil))
  2301  }
  2302  
  2303  // Issue 45451.
  2304  func test45451(t *testing.T) {
  2305  	var u *C.issue45451
  2306  	typ := reflect.ValueOf(u).Type().Elem()
  2307  
  2308  	// The type is undefined in C so allocating it should panic.
  2309  	defer func() {
  2310  		if r := recover(); r == nil {
  2311  			t.Error("expected panic")
  2312  		}
  2313  	}()
  2314  
  2315  	_ = reflect.New(typ)
  2316  	t.Errorf("reflect.New(%v) should have panicked", typ)
  2317  }
  2318  
  2319  // issue 52542
  2320  
  2321  func func52542[T ~[]C.int]() {}
  2322  
  2323  type type52542[T ~*C.float] struct{}