(root)/
gcc-13.2.0/
libffi/
testsuite/
libffi.closures/
cls_double_va.c
       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  }