OSDN Git Service

* gcc.dg/dfp/func-array.c: Support -DDBG to report individual failures.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / dfp / func-vararg-mixed.c
1 /* { dg-options "-std=gnu99" } */
2
3 /* C99 6.5.2.2 Function calls.
4    Test passing varargs of the combination of decimal float types and
5    other types.  */
6
7 #include <stdarg.h>
8
9 extern void abort (void);
10 static int failcnt = 0;
11                                                                                 
12 /* Support compiling the test to report individual failures; default is
13    to abort as soon as a check fails.  */
14 #ifdef DBG
15 #include <stdio.h>
16 #define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; }
17 #else
18 #define FAILURE abort ();
19 #endif
20
21 /* Supposing the list of varying number of arguments is:
22    unsigned int, _Decimal128, double, _Decimal32, _Decimal64.  */
23
24 static _Decimal32
25 vararg_d32 (unsigned arg, ...)
26 {
27   va_list ap;
28   _Decimal32 result;
29
30   va_start (ap, arg);
31
32   va_arg (ap, unsigned int);
33   va_arg (ap, _Decimal128);
34   va_arg (ap, double);
35   result = va_arg (ap, _Decimal32);
36
37   va_end (ap);
38   return result;
39 }
40
41 static _Decimal32
42 vararg_d64 (unsigned arg, ...)
43 {
44   va_list ap;
45   _Decimal64 result;
46
47   va_start (ap, arg);
48
49   va_arg (ap, unsigned int);
50   va_arg (ap, _Decimal128);
51   va_arg (ap, double);
52   va_arg (ap, _Decimal32);
53   result = va_arg (ap, _Decimal64);
54
55   va_end (ap);
56   return result;
57 }
58
59 static _Decimal128
60 vararg_d128 (unsigned arg, ...)
61 {
62   va_list ap;
63   _Decimal128 result;
64
65   va_start (ap, arg);
66
67   va_arg (ap, unsigned int);
68   result = va_arg (ap, _Decimal128);
69
70   va_end (ap);
71   return result;
72 }
73
74 static unsigned int
75 vararg_int (unsigned arg, ...)
76 {
77   va_list ap;
78   unsigned int result;
79
80   va_start (ap, arg);
81
82   result = va_arg (ap, unsigned int);
83
84   va_end (ap);
85   return result;
86 }
87
88 static double
89 vararg_double (unsigned arg, ...)
90 {
91   va_list ap;
92   float result;
93
94   va_start (ap, arg);
95
96   va_arg (ap, unsigned int);
97   va_arg (ap, _Decimal128);
98   result = va_arg (ap, double);
99
100   va_end (ap);
101   return result;
102 }
103
104
105 int
106 main ()
107 {
108   if (vararg_d32 (3, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 3.0df) FAILURE
109   if (vararg_d64 (4, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 4.0dd) FAILURE
110   if (vararg_d128 (1, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 1.0dl) FAILURE
111   if (vararg_int (0, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 0) FAILURE
112   if (vararg_double (2, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 2.0) FAILURE
113
114   if (failcnt != 0)
115     abort ();
116   return 0;
117 }