OSDN Git Service

* g++.dg/dfp/dfp.exp: Run tests from c-c++-common/dfp.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / c-c++-common / dfp / func-vararg-mixed.c
1 /* { dg-xfail-run-if "32-bit vararg broken" { c++ } { "*" } { "" } } */
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 #include "dfp-dbg.h"
9
10 /* Supposing the list of varying number of arguments is:
11    unsigned int, _Decimal128, double, _Decimal32, _Decimal64.  */
12
13 static _Decimal32
14 vararg_d32 (unsigned arg, ...)
15 {
16   va_list ap;
17   _Decimal32 result;
18
19   va_start (ap, arg);
20
21   va_arg (ap, unsigned int);
22   va_arg (ap, _Decimal128);
23   va_arg (ap, double);
24   result = va_arg (ap, _Decimal32);
25
26   va_end (ap);
27   return result;
28 }
29
30 static _Decimal32
31 vararg_d64 (unsigned arg, ...)
32 {
33   va_list ap;
34   _Decimal64 result;
35
36   va_start (ap, arg);
37
38   va_arg (ap, unsigned int);
39   va_arg (ap, _Decimal128);
40   va_arg (ap, double);
41   va_arg (ap, _Decimal32);
42   result = va_arg (ap, _Decimal64);
43
44   va_end (ap);
45   return result;
46 }
47
48 static _Decimal128
49 vararg_d128 (unsigned arg, ...)
50 {
51   va_list ap;
52   _Decimal128 result;
53
54   va_start (ap, arg);
55
56   va_arg (ap, unsigned int);
57   result = va_arg (ap, _Decimal128);
58
59   va_end (ap);
60   return result;
61 }
62
63 static unsigned int
64 vararg_int (unsigned arg, ...)
65 {
66   va_list ap;
67   unsigned int result;
68
69   va_start (ap, arg);
70
71   result = va_arg (ap, unsigned int);
72
73   va_end (ap);
74   return result;
75 }
76
77 static double
78 vararg_double (unsigned arg, ...)
79 {
80   va_list ap;
81   float result;
82
83   va_start (ap, arg);
84
85   va_arg (ap, unsigned int);
86   va_arg (ap, _Decimal128);
87   result = va_arg (ap, double);
88
89   va_end (ap);
90   return result;
91 }
92
93
94 int
95 main ()
96 {
97   if (vararg_d32 (3, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 3.0df) FAILURE
98   if (vararg_d64 (4, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 4.0dd) FAILURE
99   if (vararg_d128 (1, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 1.0dl) FAILURE
100   if (vararg_int (0, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 0) FAILURE
101   if (vararg_double (2, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 2.0) FAILURE
102
103   FINISH
104 }