1 /* Area: ffi_call 2 Purpose: Check return value long double. 3 Limitations: none. 4 PR: none. 5 Originator: From the original ffitest.c */ 6 7 /* { dg-excess-errors "fails" { target x86_64-*-mingw* x86_64-*-cygwin* } } */ 8 /* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */ 9 10 #include "ffitest.h" 11 #include "float.h" 12 13 static long double ldblit(float f) 14 { 15 return (long double) (((long double) f)/ (long double) 3.0); 16 } 17 18 int main (void) 19 { 20 ffi_cif cif; 21 ffi_type *args[MAX_ARGS]; 22 void *values[MAX_ARGS]; 23 float f; 24 long double ld; 25 26 args[0] = &ffi_type_float; 27 values[0] = &f; 28 29 /* Initialize the cif */ 30 CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 31 &ffi_type_longdouble, args) == FFI_OK); 32 33 f = 3.14159; 34 35 #if 1 36 /* This is ifdef'd out for now. long double support under SunOS/gcc 37 is pretty much non-existent. You'll get the odd bus error in library 38 routines like printf(). */ 39 printf ("%Lf\n", ldblit(f)); 40 #endif 41 ld = 666; 42 ffi_call(&cif, FFI_FN(ldblit), &ld, values); 43 44 #if 1 45 /* This is ifdef'd out for now. long double support under SunOS/gcc 46 is pretty much non-existent. You'll get the odd bus error in library 47 routines like printf(). */ 48 printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON); 49 #endif 50 51 /* These are not always the same!! Check for a reasonable delta */ 52 if (ld - ldblit(f) < LDBL_EPSILON) 53 puts("long double return value tests ok!"); 54 else 55 CHECK(0); 56 57 exit(0); 58 } 59