OSDN Git Service

* gcc.dg/dfp/func-array.c: Support -DDBG to report individual failures.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / dfp / convert-complex.c
1 /* { dg-options "-O3" } */
2
3 /* N1150 5.3 Conversions between decimal floating and complex.
4    C99 6.3.1.7 Conversions, arithmetic operands, real and complex.  */
5
6 extern void abort(void);
7 static int failcnt;
8
9 /* Support compiling the test to report individual failures; default is
10    to abort as soon as a check fails.  */
11 #ifdef DBG
12 #include <stdio.h>
13 #define FAILURE { printf ("failed at line %d\n", __LINE__); failcnt++; }
14 #else
15 #define FAILURE abort ();
16 #endif
17
18 int
19 main ()
20 {
21   _Complex float cf;
22   _Complex double cd;
23   _Complex long double cld;
24
25   _Decimal32 d32;
26   _Decimal64 d64;
27   _Decimal128 d128;
28
29   cf = 2.0f *  __extension__ 1i + 3.0f;
30   cd = 2.0 * __extension__ 1i + 3.0;
31   cld = 2.0l * __extension__ 1i + 3.0l;
32
33   /* Convert complex to decimal floating.  */
34   d32 = cf;
35   d64 = cd;
36   d128 = cld;
37
38   if (d32 != 3.0DF)
39     FAILURE
40   if (d64 != 3.0dd)
41     FAILURE
42   if (d128 != 3.0dl)
43     FAILURE
44
45   /* Convert decimal floating to complex.  */
46   d32 = 2.5DF;
47   d64 = 1.5DD;
48   d128 = 2.5DL;
49
50   cf = d32;
51   cd = d64;
52   cld = d128;
53  
54   /* N1107 5.3 Conversions between decimal floating and complex. 
55      When a value of decimal floating type converted to a complex
56      type, the real part of the complex result value is undermined
57      by the rules of conversions in N1107 5.2 and the imaginary part
58      of the complex result value is zero.  */
59
60   if (__real__ cf != 2.5f)
61     FAILURE
62   if (__real__ cd !=1.5)
63     FAILURE
64   if (__real__ cld !=  2.5)
65     FAILURE
66   if (__imag__ cf != 0.0f)
67     FAILURE
68   if (__imag__ cd != 0.0)
69     FAILURE
70   if (__imag__ cld != 0.0l)
71     FAILURE
72
73   /*  Verify that the conversions from DFP types to complex is
74       determined by the rules of conversion to the real part.  */
75
76   /*  Convert _Decimal64 to _Complex float.  */
77   d64 = 0.125dl;
78   cf = d64;
79   if (__real__ cf != 0.125f)
80     FAILURE
81   /*  Convert _Decimal128 to _Complex double.  */
82   d128 = 1.25E-7dl;
83   cd = d128;
84   if (__real__ cd != 1.25E-7)
85     FAILURE
86
87   /*  Verify that conversion from complex to decimal floating types
88       results in the value of the real part converted to the result
89       type according to the rules of conversion between those types.  */
90
91   /*  Convert _Complex float to decimal float types.  */
92   cf = 2.0f *  __extension__ 1i + 2.25f;
93   d32 = cf;
94   d64 = cf;
95   d128 = cf;
96   if (d32 != 2.25DF)
97     FAILURE
98   if (d64 != 2.25DD)
99     FAILURE
100   if (d128 != 2.25DL)
101     FAILURE
102
103   /*  Convert _Complex double to decimal float types.  */
104   cd = 2.0 *  __extension__ 1i + 1.25;
105   d32 = cd;
106   d64 = cd;
107   d128 = cd;
108   if (d32 != 1.25DF)
109     FAILURE
110   if (d64 != 1.25DD)
111     FAILURE
112   if (d128 != 1.25DL)
113     FAILURE
114
115   /*  Convert _Complex long double to decimal float types.  */
116   cld = 2.0l *  __extension__ 1i + 0.0625l;
117   d32 = cld;
118   d64 = cld;
119   d128 = cld;
120   if (d32 != 0.0625DF)
121     FAILURE
122   if (d64 != 0.0625DD)
123     FAILURE
124   if (d128 != 0.0625DL)
125     FAILURE
126
127   if (failcnt != 0)
128     abort ();
129
130   return 0;
131 }