OSDN Git Service

63df2d26305244ff91ee71f5a942a0353783786b
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / torture / builtin-complex-1.c
1 /* Test __builtin_complex semantics.  */
2 /* { dg-do run } */
3 /* { dg-options "-std=c1x -pedantic-errors" } */
4
5 extern void exit (int);
6 extern void abort (void);
7
8 #define COMPARE_BODY(A, B, TYPE, COPYSIGN)                              \
9   do {                                                                  \
10     TYPE s1 = COPYSIGN ((TYPE) 1.0, A);                                 \
11     TYPE s2 = COPYSIGN ((TYPE) 1.0, B);                                 \
12     if (s1 != s2)                                                       \
13       abort ();                                                         \
14     if ((__builtin_isnan (A) != 0) != (__builtin_isnan (B) != 0))       \
15       abort ();                                                         \
16     if ((A != B) != (__builtin_isnan (A) != 0))                         \
17       abort ();                                                         \
18   } while (0)
19
20 void
21 comparef (float a, float b)
22 {
23   COMPARE_BODY (a, b, float, __builtin_copysignf);
24 }
25
26 void
27 compare (double a, double b)
28 {
29   COMPARE_BODY (a, b, double, __builtin_copysign);
30 }
31
32 void
33 comparel (long double a, long double b)
34 {
35   COMPARE_BODY (a, b, long double, __builtin_copysignl);
36 }
37
38 void
39 comparecf (_Complex float a, float r, float i)
40 {
41   comparef (__real__ a, r);
42   comparef (__imag__ a, i);
43 }
44
45 void
46 comparec (_Complex double a, double r, double i)
47 {
48   compare (__real__ a, r);
49   compare (__imag__ a, i);
50 }
51
52 void
53 comparecl (_Complex long double a, long double r, long double i)
54 {
55   comparel (__real__ a, r);
56   comparel (__imag__ a, i);
57 }
58
59 #define VERIFY(A, B, TYPE, COMPARE)                     \
60   do {                                                  \
61     TYPE a = A;                                         \
62     TYPE b = B;                                         \
63     _Complex TYPE cr = __builtin_complex (a, b);        \
64     static _Complex TYPE cs = __builtin_complex (A, B); \
65     COMPARE (cr, A, B);                                 \
66     COMPARE (cs, A, B);                                 \
67   } while (0)
68
69 #define ALL_CHECKS(PZ, NZ, NAN, INF, TYPE, COMPARE)     \
70   do {                                                  \
71     VERIFY (PZ, PZ, TYPE, COMPARE);                     \
72     VERIFY (PZ, NZ, TYPE, COMPARE);                     \
73     VERIFY (PZ, NAN, TYPE, COMPARE);                    \
74     VERIFY (PZ, INF, TYPE, COMPARE);                    \
75     VERIFY (NZ, PZ, TYPE, COMPARE);                     \
76     VERIFY (NZ, NZ, TYPE, COMPARE);                     \
77     VERIFY (NZ, NAN, TYPE, COMPARE);                    \
78     VERIFY (NZ, INF, TYPE, COMPARE);                    \
79     VERIFY (NAN, PZ, TYPE, COMPARE);                    \
80     VERIFY (NAN, NZ, TYPE, COMPARE);                    \
81     VERIFY (NAN, NAN, TYPE, COMPARE);                   \
82     VERIFY (NAN, INF, TYPE, COMPARE);                   \
83     VERIFY (INF, PZ, TYPE, COMPARE);                    \
84     VERIFY (INF, NZ, TYPE, COMPARE);                    \
85     VERIFY (INF, NAN, TYPE, COMPARE);                   \
86     VERIFY (INF, INF, TYPE, COMPARE);                   \
87   } while (0)
88
89 void
90 check_float (void)
91 {
92   ALL_CHECKS (0.0f, -0.0f, __builtin_nanf(""), __builtin_inff(),
93               float, comparecf);
94 }
95
96 void
97 check_double (void)
98 {
99   ALL_CHECKS (0.0, -0.0, __builtin_nan(""), __builtin_inf(),
100               double, comparec);
101 }
102
103 void
104 check_long_double (void)
105 {
106   ALL_CHECKS (0.0l, -0.0l, __builtin_nanl(""), __builtin_infl(),
107               long double, comparecl);
108 }
109
110 int
111 main (void)
112 {
113   check_float ();
114   check_double ();
115   check_long_double ();
116   exit (0);
117 }