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-2.c
1 /* { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
2 /* { dg-xfail-run-if "32-bit vararg broken" { c++ } { "*" } { "" } } */
3 /* { dg-options "-mpreferred-stack-boundary=2" } */
4
5 /* C99 6.5.2.2 Function calls.
6    Test passing varargs of the combination of decimal float types and
7    other types.  */
8
9 #include <stdarg.h>
10 #include "dfp-dbg.h"
11
12 /* Supposing the list of varying number of arguments is:
13    unsigned int, _Decimal128, double, _Decimal32, _Decimal64.  */
14
15 static _Decimal32
16 vararg_d32 (unsigned arg, ...)
17 {
18   va_list ap;
19   _Decimal32 result;
20
21   va_start (ap, arg);
22
23   va_arg (ap, unsigned int);
24   va_arg (ap, _Decimal128);
25   va_arg (ap, double);
26   result = va_arg (ap, _Decimal32);
27
28   va_end (ap);
29   return result;
30 }
31
32 static _Decimal32
33 vararg_d64 (unsigned arg, ...)
34 {
35   va_list ap;
36   _Decimal64 result;
37
38   va_start (ap, arg);
39
40   va_arg (ap, unsigned int);
41   va_arg (ap, _Decimal128);
42   va_arg (ap, double);
43   va_arg (ap, _Decimal32);
44   result = va_arg (ap, _Decimal64);
45
46   va_end (ap);
47   return result;
48 }
49
50 static _Decimal128
51 vararg_d128 (unsigned arg, ...)
52 {
53   va_list ap;
54   _Decimal128 result;
55
56   va_start (ap, arg);
57
58   va_arg (ap, unsigned int);
59   result = va_arg (ap, _Decimal128);
60
61   va_end (ap);
62   return result;
63 }
64
65 static unsigned int
66 vararg_int (unsigned arg, ...)
67 {
68   va_list ap;
69   unsigned int result;
70
71   va_start (ap, arg);
72
73   result = va_arg (ap, unsigned int);
74
75   va_end (ap);
76   return result;
77 }
78
79 static double
80 vararg_double (unsigned arg, ...)
81 {
82   va_list ap;
83   float result;
84
85   va_start (ap, arg);
86
87   va_arg (ap, unsigned int);
88   va_arg (ap, _Decimal128);
89   result = va_arg (ap, double);
90
91   va_end (ap);
92   return result;
93 }
94
95
96 int
97 main ()
98 {
99   if (vararg_d32 (3, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 3.0df) FAILURE
100   if (vararg_d64 (4, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 4.0dd) FAILURE
101   if (vararg_d128 (1, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 1.0dl) FAILURE
102   if (vararg_int (0, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 0) FAILURE
103   if (vararg_double (2, 0, 1.0dl, 2.0, 3.0df, 4.0dd) != 2.0) FAILURE
104
105   FINISH
106 }