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 mips*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
8#include "ffitest.h"
9
10static void
11cls_double_va_fn(ffi_cif* cif, void* resp, void** args, void* userdata)
12{
13	char*	format		= *(char**)args[0];
14	double	doubleValue	= *(double*)args[1];
15
16	*(ffi_arg*)resp = printf(format, doubleValue);
17}
18
19int main (void)
20{
21	ffi_cif cif;
22#ifndef USING_MMAP
23	static ffi_closure cl;
24#endif
25	ffi_closure *pcl;
26	void* args[3];
27	ffi_type* arg_types[3];
28
29#ifdef USING_MMAP
30	pcl = allocate_mmap(sizeof(ffi_closure));
31#else
32	pcl = &cl;
33#endif
34
35	char*	format		= "%.1f\n";
36	double	doubleArg	= 7;
37	ffi_arg	res			= 0;
38
39	arg_types[0] = &ffi_type_pointer;
40	arg_types[1] = &ffi_type_double;
41	arg_types[2] = NULL;
42
43	CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
44		arg_types) == FFI_OK);
45
46	args[0] = &format;
47	args[1] = &doubleArg;
48	args[2] = NULL;
49
50	ffi_call(&cif, FFI_FN(printf), &res, args);
51	// { dg-output "7.0" }
52	printf("res: %d\n", res);
53	// { dg-output "\nres: 4" }
54
55	CHECK(ffi_prep_closure(pcl, &cif, cls_double_va_fn, NULL) == FFI_OK);
56
57	res	= ((int(*)(char*, double))(pcl))(format, doubleArg);
58	// { dg-output "\n7.0" }
59	printf("res: %d\n", res);
60	// { dg-output "\nres: 4" }
61
62	exit(0);
63}
64