github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/testsuite/libffi.call/cls_double_va.c (about)

     1  /* Area:		ffi_call, closure_call
     2     Purpose:		Test doubles passed in variable argument lists.
     3     Limitations:	none.
     4     PR:			none.
     5     Originator:	Blake Chaffin 6/6/2007	 */
     6  
     7  /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
     8  /* { dg-output "" { xfail avr32*-*-* } } */
     9  /* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
    10  
    11  #include "ffitest.h"
    12  
    13  static void
    14  cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp, 
    15  		 void** args, void* userdata __UNUSED__)
    16  {
    17  	char*	format		= *(char**)args[0];
    18  	double	doubleValue	= *(double*)args[1];
    19  
    20  	*(ffi_arg*)resp = printf(format, doubleValue);
    21  }
    22  
    23  int main (void)
    24  {
    25  	ffi_cif cif;
    26          void *code;
    27  	ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
    28  	void* args[3];
    29  	ffi_type* arg_types[3];
    30  
    31  	char*	format		= "%.1f\n";
    32  	double	doubleArg	= 7;
    33  	ffi_arg	res			= 0;
    34  
    35  	arg_types[0] = &ffi_type_pointer;
    36  	arg_types[1] = &ffi_type_double;
    37  	arg_types[2] = NULL;
    38  
    39  	/* This printf call is variadic */
    40  	CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, &ffi_type_sint,
    41  			       arg_types) == FFI_OK);
    42  
    43  	args[0] = &format;
    44  	args[1] = &doubleArg;
    45  	args[2] = NULL;
    46  
    47  	ffi_call(&cif, FFI_FN(printf), &res, args);
    48  	/* { dg-output "7.0" } */
    49  	printf("res: %d\n", (int) res);
    50  	/* { dg-output "\nres: 4" } */
    51  
    52  	CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL,
    53  				   code) == FFI_OK);
    54  
    55  	res = ((int(*)(char*, ...))(code))(format, doubleArg);
    56  	/* { dg-output "\n7.0" } */
    57  	printf("res: %d\n", (int) res);
    58  	/* { dg-output "\nres: 4" } */
    59  
    60  	exit(0);
    61  }