Home | History | Annotate | Download | only in libffi.call
      1 /* Area:		ffi_call, closure_call
      2    Purpose:		Test long 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*-*-* x86_64-*-mingw* } } */
      9 /* { dg-output "" { xfail mips-sgi-irix6* } } PR libffi/46660 */
     10 
     11 #include "ffitest.h"
     12 
     13 static void
     14 cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp,
     15 		     void** args, void* userdata __UNUSED__)
     16 {
     17 	char*		format	= *(char**)args[0];
     18 	long double	ldValue	= *(long double*)args[1];
     19 
     20 	*(ffi_arg*)resp = printf(format, ldValue);
     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	= "%.1Lf\n";
     32 	long double	ldArg	= 7;
     33 	ffi_arg		res		= 0;
     34 
     35 	arg_types[0] = &ffi_type_pointer;
     36 	arg_types[1] = &ffi_type_longdouble;
     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] = &ldArg;
     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_longdouble_va_fn, NULL,
     53 				   code) == FFI_OK);
     54 
     55 	res = ((int(*)(char*, ...))(code))(format, ldArg);
     56 	/* { dg-output "\n7.0" } */
     57 	printf("res: %d\n", (int) res);
     58 	/* { dg-output "\nres: 4" } */
     59 
     60 	exit(0);
     61 }
     62