31cd5874ffba59e612a4bffe114a5db5c6240a72
[gcc.git] / gcc / testsuite / gcc.dg / torture / builtin-cproj-1.c
1 /* Copyright (C) 2010 Free Software Foundation.
2
3 Verify that folding of built-in cproj is correctly performed by the
4 compiler.
5
6 Origin: Kaveh R. Ghazi, April 9, 2010. */
7
8 /* { dg-do link } */
9
10 /* All references to link_error should go away at compile-time. The
11 argument is the __LINE__ number. It appears in the tree dump file
12 and aids in debugging should any of the tests fail. */
13 extern void link_error(int);
14
15 #define CPROJ(X) __builtin_cproj(X)
16 #define CPROJF(X) __builtin_cprojf(X)
17 #define CPROJL(X) __builtin_cprojl(X)
18 #define INF __builtin_inff()
19 #define I 1i
20 #define CPSGN(X,Y) __builtin_copysignf((X),(Y))
21 #define CIMAG(X) __builtin_cimagf(X)
22 #define CREAL(X) __builtin_crealf(X)
23
24 /* Check that the signs of the real and/or imaginary parts of two
25 complex numbers match. */
26 #define CKSGN(X,Y) (CKSGN_R(X,Y) || CKSGN_I(X,Y))
27 #define CKSGN_R(X,Y) (CPSGN(1,CREAL(X)) != CPSGN(1,CREAL(Y)))
28 #define CKSGN_I(X,Y) (CPSGN(1,CIMAG(X)) != CPSGN(1,CIMAG(Y)))
29
30 /* Test that (cproj(X) == ZERO+Inf) and that the signs of the
31 imaginary parts match. ZERO is +/- 0i. */
32 #define TEST_CST_INF(X,ZERO) do { \
33 if (CPROJF(X) != ZERO+INF || CKSGN_I(CPROJF(X),ZERO+INF)) \
34 link_error(__LINE__); \
35 if (CPROJ(X) != ZERO+INF || CKSGN_I(CPROJ(X),ZERO+INF)) \
36 link_error(__LINE__); \
37 if (CPROJL(X) != ZERO+INF || CKSGN_I(CPROJL(X),ZERO+INF)) \
38 link_error(__LINE__); \
39 } while (0)
40
41 /* Test that (cproj(X) == X) for all finite (X). */
42 #define TEST_CST(X) do { \
43 if (CPROJF(X) != (X) || CKSGN(CPROJF(X),(X))) \
44 link_error(__LINE__); \
45 } while (0)
46
47 /* Test that cproj(X + I*INF) -> (ZERO + INF), where ZERO is +-0i.
48 NEG is either blank or a minus sign when ZERO is negative. */
49 #define TEST_IMAG_INF(NEG,ZERO) do { \
50 if (CPROJF(f+I*NEG INF) != ZERO+INF \
51 || CKSGN_I (CPROJF(f+I*NEG INF), ZERO+INF)) \
52 link_error(__LINE__); \
53 if (CPROJ(d+I*NEG INF) != ZERO+INF \
54 || CKSGN_I (CPROJ(d+I*NEG INF), ZERO+INF)) \
55 link_error(__LINE__); \
56 if (CPROJL(ld+I*NEG INF) != ZERO+INF \
57 || CKSGN_I (CPROJL(ld+I*NEG INF), ZERO+INF)) \
58 link_error(__LINE__); \
59 } while (0)
60
61 /* Like TEST_IMAG_INF, but check that side effects are honored. */
62 #define TEST_IMAG_INF_SIDE_EFFECT(NEG,ZERO) do { \
63 int side = 4; \
64 if (CPROJF(++side+I*NEG INF) != ZERO+INF \
65 || CKSGN_I (CPROJF(++side+I*NEG INF), ZERO+INF)) \
66 link_error(__LINE__); \
67 if (CPROJ(++side+I*NEG INF) != ZERO+INF \
68 || CKSGN_I (CPROJ(++side+I*NEG INF), ZERO+INF)) \
69 link_error(__LINE__); \
70 if (CPROJL(++side+I*NEG INF) != ZERO+INF \
71 || CKSGN_I (CPROJL(++side+I*NEG INF), ZERO+INF)) \
72 link_error(__LINE__); \
73 if (side != 10) \
74 link_error(__LINE__); \
75 } while (0)
76
77 /* Test that cproj(INF, POSITIVE) -> INF+0i. NEG is either blank or a
78 minus sign to test negative INF. */
79 #define TEST_REAL_INF(NEG) do { \
80 __real cf = NEG INF; \
81 __imag cf = (x ? 4 : 5); \
82 if (CPROJF(cf) != INF \
83 || CKSGN_I (CPROJF(cf), INF)) \
84 link_error(__LINE__); \
85 __real cd = NEG INF; \
86 __imag cd = (x ? 4 : 5); \
87 if (CPROJ(cd) != INF \
88 || CKSGN_I (CPROJ(cd), INF)) \
89 link_error(__LINE__); \
90 __real cld = NEG INF; \
91 __imag cld = (x ? 4 : 5); \
92 if (CPROJL(cld) != INF \
93 || CKSGN_I (CPROJL(cld), INF)) \
94 link_error(__LINE__); \
95 } while (0)
96
97 /* Like TEST_REAL_INF, but check that side effects are honored. */
98 #define TEST_REAL_INF_SIDE_EFFECT(NEG) do { \
99 int side = -9; \
100 __real cf = NEG INF; \
101 __imag cf = (x ? 4 : 5); \
102 if (CPROJF((++side,cf)) != INF \
103 || CKSGN_I (CPROJF((++side,cf)), INF)) \
104 link_error(__LINE__); \
105 __real cd = NEG INF; \
106 __imag cd = (x ? 4 : 5); \
107 if (CPROJ((++side,cd)) != INF \
108 || CKSGN_I (CPROJ((++side,cd)), INF)) \
109 link_error(__LINE__); \
110 __real cld = NEG INF; \
111 __imag cld = (x ? 4 : 5); \
112 if (CPROJL((++side,cld)) != INF \
113 || CKSGN_I (CPROJL((++side,cld)), INF)) \
114 link_error(__LINE__); \
115 if (side != -3) \
116 link_error(__LINE__); \
117 } while (0)
118
119 void foo (_Complex long double cld, _Complex double cd, _Complex float cf,
120 long double ld, double d, float f, int x)
121 {
122 TEST_CST_INF (INF+0I, 0);
123 TEST_CST_INF (INF-0I, -0.FI);
124 TEST_CST_INF (INF+4I, 0);
125 TEST_CST_INF (INF-4I, -0.FI);
126 TEST_CST_INF (-INF+0I, 0);
127 TEST_CST_INF (-INF-0I, -0.FI);
128 TEST_CST_INF (-INF+4I, 0);
129 TEST_CST_INF (-INF-4I, -0.FI);
130
131 TEST_CST_INF (0+I*INF, 0);
132 TEST_CST_INF (0-I*INF, -0.FI);
133 TEST_CST_INF (23+I*INF, 0);
134 TEST_CST_INF (23-I*INF, -0.FI);
135 TEST_CST_INF (-0.F+I*INF, 0);
136 TEST_CST_INF (-0.F-I*INF, -0.FI);
137 TEST_CST_INF (-23+I*INF, 0);
138 TEST_CST_INF (-23-I*INF, -0.FI);
139
140 TEST_CST_INF (INF+I*INF, 0);
141 TEST_CST_INF (INF-I*INF, -0.FI);
142 TEST_CST_INF (-INF+I*INF, 0);
143 TEST_CST_INF (-INF-I*INF, -0.FI);
144
145 TEST_CST (0);
146 TEST_CST (-0.F);
147 TEST_CST (0-0.FI);
148 TEST_CST (-0.F-0.FI);
149
150 TEST_CST (22+3I);
151 TEST_CST (22-3I);
152 TEST_CST (-22+3I);
153 TEST_CST (-22-3I);
154
155 TEST_IMAG_INF (,0.FI);
156 TEST_IMAG_INF (-,-0.FI);
157
158 #ifdef __OPTIMIZE__
159 TEST_REAL_INF( );
160 TEST_REAL_INF(-);
161
162 TEST_IMAG_INF_SIDE_EFFECT (,0.FI);
163 TEST_IMAG_INF_SIDE_EFFECT (-,-0.FI);
164
165 TEST_REAL_INF_SIDE_EFFECT( );
166 TEST_REAL_INF_SIDE_EFFECT(-);
167 #endif
168
169 return;
170 }
171
172 int main (void)
173 {
174 return 0;
175 }