1 /* Test for _Atomic in C11.  Test floating-point exceptions for
2    compound assignment are consistent with result (so that if multiple
3    iterations of the compare-and-exchange loop are needed, exceptions
4    get properly cleared).  */
5 /* { dg-do run } */
6 /* { dg-options "-std=c11 -pedantic-errors -pthread -U_POSIX_C_SOURCE -D_POSIX_C_SOURCE=200809L" } */
7 /* { dg-add-options ieee } */
8 /* { dg-additional-options "-mfp-trap-mode=sui" { target alpha*-*-* } } */
9 /* { dg-additional-options "-D_XOPEN_SOURCE=600" { target *-*-solaris2* } } */
10 /* { dg-require-effective-target fenv_exceptions } */
11 /* { dg-require-effective-target pthread } */
12 /* { dg-timeout-factor 2 } */
13 
14 #include <fenv.h>
15 #include <float.h>
16 #include <pthread.h>
17 #include <stdbool.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 
21 #define TEST_ALL_EXCEPT (FE_DIVBYZERO		\
22 			 | FE_INEXACT		\
23 			 | FE_INVALID		\
24 			 | FE_OVERFLOW		\
25 			 | FE_UNDERFLOW)
26 
27 #if defined __alpha__ || defined __aarch64__
28   #define ITER_COUNT 100
29 #else
30   #define ITER_COUNT 10000
31 #endif
32 
33 static volatile _Atomic bool thread_ready, thread_stop;
34 
35 /* Generate test code (with NAME used to name functions and variables)
36    for atomic compound assignments to a variable of type LHSTYPE.  One
37    thread repeatedly stores the values INIT1 and INIT2 in a variable,
38    while the other repeatedly executes PRE var POST having set
39    floating-point exceptions to BEXC.  If the value of the assignment
40    operation satisfies VALTEST1 (var), the floating-point exceptions
41    should be BEXC | EXC1; otherwise, they should be BEXC | EXC2.  A
42    function test_main_##NAME is generated that returns nonzero on
43    failure, zero on success.  */
44 
45 #define TEST_FUNCS(NAME, LHSTYPE, PRE, POST, BEXC,			\
46 		   INIT1, VALTEST1, EXC1, INIT2, EXC2)			\
47 									\
48 static volatile _Atomic LHSTYPE var_##NAME;				\
49 									\
50 static void *								\
51 test_thread_##NAME (void *arg)						\
52 {									\
53   thread_ready = true;							\
54   while (!thread_stop)							\
55     {									\
56       var_##NAME = (INIT1);						\
57       var_##NAME = (INIT2);						\
58     }									\
59   return NULL;								\
60 }									\
61 									\
62 static int								\
63 test_main_##NAME (void)							\
64 {									\
65   thread_stop = false;							\
66   thread_ready = false;							\
67   var_##NAME = (INIT1);							\
68   pthread_t thread_id;							\
69   int pret = pthread_create (&thread_id, NULL, test_thread_##NAME,	\
70 			     NULL);					\
71   if (pret != 0)							\
72     {									\
73       printf ("pthread_create failed: %d\n", pret);			\
74       return 1;								\
75     }									\
76   int num_1_pass = 0, num_1_fail = 0, num_2_pass = 0, num_2_fail = 0;	\
77   while (!thread_ready)							\
78     ;									\
79   for (int i = 0; i < ITER_COUNT; i++)					\
80     {									\
81       feclearexcept (FE_ALL_EXCEPT);					\
82       feraiseexcept (BEXC);						\
83       LHSTYPE r = (PRE var_##NAME POST);				\
84       int rexc = fetestexcept (TEST_ALL_EXCEPT);			\
85       if (VALTEST1 (r))							\
86 	{								\
87 	  if (rexc == ((BEXC) | (EXC1)))				\
88 	    num_1_pass++;						\
89 	  else								\
90 	    num_1_fail++;						\
91 	  var_##NAME = (INIT2);						\
92 	}								\
93       else								\
94 	{								\
95 	  if (rexc == ((BEXC) | (EXC2)))				\
96 	    num_2_pass++;						\
97 	  else								\
98 	    num_2_fail++;						\
99 	  var_##NAME = (INIT1);						\
100 	}								\
101     }									\
102   thread_stop = true;							\
103   pthread_join (thread_id, NULL);					\
104   printf (#NAME " (a) %d pass, %d fail; (b) %d pass, %d fail\n",	\
105 	  num_1_pass, num_1_fail, num_2_pass, num_2_fail);		\
106   return num_1_fail || num_2_fail;					\
107 }
108 
109 TEST_FUNCS (float_add_invalid, float, , += __builtin_inff (), 0,
110 	    0, __builtin_isinf, 0,
111 	    -__builtin_inff (), FE_INVALID)
112 TEST_FUNCS (float_add_invalid_prev, float, , += __builtin_inff (),
113 	    FE_DIVBYZERO | FE_INEXACT | FE_OVERFLOW | FE_UNDERFLOW,
114 	    0, __builtin_isinf, 0,
115 	    -__builtin_inff (), FE_INVALID)
116 TEST_FUNCS (float_add_overflow, float, , += FLT_MAX, 0,
117 	    FLT_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
118 	    0, 0)
119 TEST_FUNCS (float_add_overflow_prev, float, , += FLT_MAX, FE_INVALID,
120 	    FLT_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
121 	    0, 0)
122 TEST_FUNCS (float_add_overflow_double, float, , += (double) FLT_MAX, 0,
123 	    FLT_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
124 	    0, 0)
125 TEST_FUNCS (float_add_overflow_long_double, float, , += (long double) FLT_MAX, 0,
126 	    FLT_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
127 	    0, 0)
128 #define NOT_FLT_EPSILON_2(X) ((X) != FLT_EPSILON / 2)
129 TEST_FUNCS (float_add_inexact, float, , += FLT_EPSILON / 2, 0,
130 	    1.0f, NOT_FLT_EPSILON_2, FE_INEXACT,
131 	    0, 0)
132 #define NOT_0(X) ((X) != 0)
133 TEST_FUNCS (float_add_inexact_int, float, , += 1, 0,
134 	    FLT_EPSILON / 2, NOT_0, FE_INEXACT,
135 	    -1, 0)
136 TEST_FUNCS (float_preinc_inexact, float, ++, , 0,
137 	    FLT_EPSILON / 2, NOT_0, FE_INEXACT,
138 	    -1, 0)
139 #define NOT_MINUS_1(X) ((X) != -1)
140 TEST_FUNCS (float_postinc_inexact, float, , ++, 0,
141 	    FLT_EPSILON / 2, NOT_MINUS_1, FE_INEXACT,
142 	    -1, 0)
143 #if FLT_EVAL_METHOD == 0
144 TEST_FUNCS (long_add_float_inexact, long, , += 2 / FLT_EPSILON, 0,
145 	    1, NOT_0, FE_INEXACT,
146 	    -2 / FLT_EPSILON, 0)
147 #endif
148 #define REAL_ISINF(X) (__builtin_isinf (__real__ (X)))
149 TEST_FUNCS (complex_float_add_overflow, _Complex float, , += FLT_MAX, 0,
150 	    FLT_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
151 	    0, 0)
152 TEST_FUNCS (float_sub_invalid, float, , -= __builtin_inff (), 0,
153 	    0, __builtin_isinf, 0,
154 	    __builtin_inff (), FE_INVALID)
155 TEST_FUNCS (float_sub_overflow, float, , -= FLT_MAX, 0,
156 	    -FLT_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
157 	    0, 0)
158 #define NOT_MINUS_FLT_EPSILON_2(X) ((X) != -FLT_EPSILON / 2)
159 TEST_FUNCS (float_sub_inexact, float, , -= FLT_EPSILON / 2, 0,
160 	    -1.0f, NOT_MINUS_FLT_EPSILON_2, FE_INEXACT,
161 	    0, 0)
162 #define NOT_0(X) ((X) != 0)
163 TEST_FUNCS (float_sub_inexact_int, float, , -= 1, 0,
164 	    -FLT_EPSILON / 2, NOT_0, FE_INEXACT,
165 	    1, 0)
166 TEST_FUNCS (float_predec_inexact, float, --, , 0,
167 	    -FLT_EPSILON / 2, NOT_0, FE_INEXACT,
168 	    1, 0)
169 #define NOT_1(X) ((X) != 1)
170 TEST_FUNCS (float_postdec_inexact, float, , --, 0,
171 	    -FLT_EPSILON / 2, NOT_1, FE_INEXACT,
172 	    1, 0)
173 #if FLT_EVAL_METHOD == 0
174 TEST_FUNCS (long_sub_float_inexact, long, , -= 2 / FLT_EPSILON, 0,
175 	    -1, NOT_0, FE_INEXACT,
176 	    2 / FLT_EPSILON, 0)
177 #endif
178 TEST_FUNCS (complex_float_sub_overflow, _Complex float, , -= FLT_MAX, 0,
179 	    -FLT_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
180 	    0, 0)
181 TEST_FUNCS (float_mul_invalid, float, , *= __builtin_inff (), 0,
182 	    __builtin_inff (), __builtin_isinf, 0,
183 	    0, FE_INVALID)
184 TEST_FUNCS (float_mul_overflow, float, , *= FLT_MAX, 0,
185 	    FLT_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
186 	    0, 0)
187 #define IS_0(X) ((X) == 0)
188 TEST_FUNCS (float_mul_underflow, float, , *= FLT_MIN, 0,
189 	    FLT_MIN, IS_0, FE_UNDERFLOW | FE_INEXACT,
190 	    1, 0)
191 TEST_FUNCS (float_mul_inexact, float, , *= 1 + FLT_EPSILON, 0,
192 	    1 + FLT_EPSILON, NOT_0, FE_INEXACT,
193 	    0, 0)
194 TEST_FUNCS (float_mul_inexact_int, float, , *= 3, 0,
195 	    1 + FLT_EPSILON, NOT_0, FE_INEXACT,
196 	    0, 0)
197 #if FLT_EVAL_METHOD == 0
198 TEST_FUNCS(long_mul_float_inexact, long, , *= 3.0f, 0,
199 	   1 + 1 / FLT_EPSILON, NOT_0, FE_INEXACT,
200 	   0, 0)
201 #endif
202 TEST_FUNCS (complex_float_mul_overflow, _Complex float, , *= FLT_MAX, 0,
203 	    FLT_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
204 	    0, 0)
205 TEST_FUNCS (float_div_invalid_divbyzero, float, , /= 0.0f, 0,
206 	    1, __builtin_isinf, FE_DIVBYZERO,
207 	    0, FE_INVALID)
208 TEST_FUNCS (float_div_overflow, float, , /= FLT_MIN, 0,
209 	    FLT_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
210 	    0, 0)
211 TEST_FUNCS (float_div_underflow, float, , /= FLT_MAX, 0,
212 	    FLT_MIN, IS_0, FE_UNDERFLOW | FE_INEXACT,
213 	    FLT_MAX, 0)
214 TEST_FUNCS (float_div_inexact, float, , /= 3.0f, 0,
215 	    1, NOT_0, FE_INEXACT,
216 	    0, 0)
217 TEST_FUNCS (float_div_inexact_int, float, , /= 3, 0,
218 	    1, NOT_0, FE_INEXACT,
219 	    0, 0)
220 TEST_FUNCS (int_div_float_inexact, int, , /= 3.0f, 0,
221 	    4, NOT_0, FE_INEXACT,
222 	    0, 0)
223 TEST_FUNCS (complex_float_div_overflow, _Complex float, , /= FLT_MIN, 0,
224 	    FLT_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
225 	    0, 0)
226 
227 TEST_FUNCS (double_add_invalid, double, , += __builtin_inf (), 0,
228 	    0, __builtin_isinf, 0,
229 	    -__builtin_inf (), FE_INVALID)
230 TEST_FUNCS (double_add_overflow, double, , += DBL_MAX, 0,
231 	    DBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
232 	    0, 0)
233 TEST_FUNCS (double_add_overflow_long_double, double, , += (long double) DBL_MAX, 0,
234 	    DBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
235 	    0, 0)
236 #define NOT_DBL_EPSILON_2(X) ((X) != DBL_EPSILON / 2)
237 TEST_FUNCS (double_add_inexact, double, , += DBL_EPSILON / 2, 0,
238 	    1.0, NOT_DBL_EPSILON_2, FE_INEXACT,
239 	    0, 0)
240 TEST_FUNCS (double_add_inexact_int, double, , += 1, 0,
241 	    DBL_EPSILON / 2, NOT_0, FE_INEXACT,
242 	    -1, 0)
243 TEST_FUNCS (double_preinc_inexact, double, ++, , 0,
244 	    DBL_EPSILON / 2, NOT_0, FE_INEXACT,
245 	    -1, 0)
246 TEST_FUNCS (double_postinc_inexact, double, , ++, 0,
247 	    DBL_EPSILON / 2, NOT_MINUS_1, FE_INEXACT,
248 	    -1, 0)
249 #if FLT_EVAL_METHOD == 0
250 TEST_FUNCS (long_long_add_double_inexact, long long, , += 2 / DBL_EPSILON, 0,
251 	    1, NOT_0, FE_INEXACT,
252 	    -2 / DBL_EPSILON, 0)
253 #endif
254 TEST_FUNCS (complex_double_add_overflow, _Complex double, , += DBL_MAX, 0,
255 	    DBL_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
256 	    0, 0)
257 TEST_FUNCS (double_sub_invalid, double, , -= __builtin_inf (), 0,
258 	    0, __builtin_isinf, 0,
259 	    __builtin_inf (), FE_INVALID)
260 TEST_FUNCS (double_sub_overflow, double, , -= DBL_MAX, 0,
261 	    -DBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
262 	    0, 0)
263 #define NOT_MINUS_DBL_EPSILON_2(X) ((X) != -DBL_EPSILON / 2)
264 TEST_FUNCS (double_sub_inexact, double, , -= DBL_EPSILON / 2, 0,
265 	    -1.0, NOT_MINUS_DBL_EPSILON_2, FE_INEXACT,
266 	    0, 0)
267 TEST_FUNCS (double_sub_inexact_int, double, , -= 1, 0,
268 	    -DBL_EPSILON / 2, NOT_0, FE_INEXACT,
269 	    1, 0)
270 TEST_FUNCS (double_predec_inexact, double, --, , 0,
271 	    -DBL_EPSILON / 2, NOT_0, FE_INEXACT,
272 	    1, 0)
273 TEST_FUNCS (double_postdec_inexact, double, , --, 0,
274 	    -DBL_EPSILON / 2, NOT_1, FE_INEXACT,
275 	    1, 0)
276 #if FLT_EVAL_METHOD == 0
277 TEST_FUNCS (long_long_sub_double_inexact, long long, , -= 2 / DBL_EPSILON, 0,
278 	    -1, NOT_0, FE_INEXACT,
279 	    2 / DBL_EPSILON, 0)
280 #endif
281 TEST_FUNCS (complex_double_sub_overflow, _Complex double, , -= DBL_MAX, 0,
282 	    -DBL_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
283 	    0, 0)
284 TEST_FUNCS (double_mul_invalid, double, , *= __builtin_inf (), 0,
285 	    __builtin_inf (), __builtin_isinf, 0,
286 	    0, FE_INVALID)
287 TEST_FUNCS (double_mul_overflow, double, , *= DBL_MAX, 0,
288 	    DBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
289 	    0, 0)
290 TEST_FUNCS (double_mul_overflow_float, double, , *= FLT_MAX, 0,
291 	    DBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
292 	    0, 0)
293 TEST_FUNCS (double_mul_underflow, double, , *= DBL_MIN, 0,
294 	    DBL_MIN, IS_0, FE_UNDERFLOW | FE_INEXACT,
295 	    1, 0)
296 TEST_FUNCS (double_mul_inexact, double, , *= 1 + DBL_EPSILON, 0,
297 	    1 + DBL_EPSILON, NOT_0, FE_INEXACT,
298 	    0, 0)
299 TEST_FUNCS (double_mul_inexact_int, double, , *= 3, 0,
300 	    1 + DBL_EPSILON, NOT_0, FE_INEXACT,
301 	    0, 0)
302 #if FLT_EVAL_METHOD == 0
303 TEST_FUNCS(long_long_mul_double_inexact, long long, , *= 3.0, 0,
304 	   1 + 1 / DBL_EPSILON, NOT_0, FE_INEXACT,
305 	   0, 0)
306 #endif
307 TEST_FUNCS (complex_double_mul_overflow, _Complex double, , *= DBL_MAX, 0,
308 	    DBL_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
309 	    0, 0)
310 TEST_FUNCS (double_div_invalid_divbyzero, double, , /= 0.0, 0,
311 	    1, __builtin_isinf, FE_DIVBYZERO,
312 	    0, FE_INVALID)
313 TEST_FUNCS (double_div_overflow, double, , /= DBL_MIN, 0,
314 	    DBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
315 	    0, 0)
316 TEST_FUNCS (double_div_underflow, double, , /= DBL_MAX, 0,
317 	    DBL_MIN, IS_0, FE_UNDERFLOW | FE_INEXACT,
318 	    DBL_MAX, 0)
319 TEST_FUNCS (double_div_inexact, double, , /= 3.0, 0,
320 	    1, NOT_0, FE_INEXACT,
321 	    0, 0)
322 TEST_FUNCS (double_div_inexact_int, double, , /= 3, 0,
323 	    1, NOT_0, FE_INEXACT,
324 	    0, 0)
325 TEST_FUNCS (int_div_double_inexact, int, , /= 3.0, 0,
326 	    4, NOT_0, FE_INEXACT,
327 	    0, 0)
328 TEST_FUNCS (complex_double_div_overflow, _Complex double, , /= DBL_MIN, 0,
329 	    DBL_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
330 	    0, 0)
331 
332 TEST_FUNCS (long_double_add_invalid, long double, , += __builtin_infl (), 0,
333 	    0, __builtin_isinf, 0,
334 	    -__builtin_infl (), FE_INVALID)
335 #if LDBL_MANT_DIG != 106
336 TEST_FUNCS (long_double_add_overflow, long double, , += LDBL_MAX, 0,
337 	    LDBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
338 	    0, 0)
339 #define NOT_LDBL_EPSILON_2(X) ((X) != LDBL_EPSILON / 2)
340 TEST_FUNCS (long_double_add_inexact, long double, , += LDBL_EPSILON / 2, 0,
341 	    1.0L, NOT_LDBL_EPSILON_2, FE_INEXACT,
342 	    0, 0)
343 TEST_FUNCS (long_double_add_inexact_int, long double, , += 1, 0,
344 	    LDBL_EPSILON / 2, NOT_0, FE_INEXACT,
345 	    -1, 0)
346 TEST_FUNCS (long_double_preinc_inexact, long double, ++, , 0,
347 	    LDBL_EPSILON / 2, NOT_0, FE_INEXACT,
348 	    -1, 0)
349 TEST_FUNCS (long_double_postinc_inexact, long double, , ++, 0,
350 	    LDBL_EPSILON / 2, NOT_MINUS_1, FE_INEXACT,
351 	    -1, 0)
352 TEST_FUNCS (complex_long_double_add_overflow, _Complex long double, , += LDBL_MAX, 0,
353 	    LDBL_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
354 	    0, 0)
355 #endif
356 TEST_FUNCS (long_double_sub_invalid, long double, , -= __builtin_infl (), 0,
357 	    0, __builtin_isinf, 0,
358 	    __builtin_infl (), FE_INVALID)
359 #if LDBL_MANT_DIG != 106
360 TEST_FUNCS (long_double_sub_overflow, long double, , -= LDBL_MAX, 0,
361 	    -LDBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
362 	    0, 0)
363 #define NOT_MINUS_LDBL_EPSILON_2(X) ((X) != -LDBL_EPSILON / 2)
364 TEST_FUNCS (long_double_sub_inexact, long double, , -= LDBL_EPSILON / 2, 0,
365 	    -1.0L, NOT_MINUS_LDBL_EPSILON_2, FE_INEXACT,
366 	    0, 0)
367 TEST_FUNCS (long_double_sub_inexact_int, long double, , -= 1, 0,
368 	    -LDBL_EPSILON / 2, NOT_0, FE_INEXACT,
369 	    1, 0)
370 TEST_FUNCS (long_double_predec_inexact, long double, --, , 0,
371 	    -LDBL_EPSILON / 2, NOT_0, FE_INEXACT,
372 	    1, 0)
373 TEST_FUNCS (long_double_postdec_inexact, long double, , --, 0,
374 	    -LDBL_EPSILON / 2, NOT_1, FE_INEXACT,
375 	    1, 0)
376 TEST_FUNCS (complex_long_double_sub_overflow, _Complex long double, , -= LDBL_MAX, 0,
377 	    -LDBL_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
378 	    0, 0)
379 #endif
380 TEST_FUNCS (long_double_mul_invalid, long double, , *= __builtin_infl (), 0,
381 	    __builtin_infl (), __builtin_isinf, 0,
382 	    0, FE_INVALID)
383 TEST_FUNCS (long_double_mul_overflow, long double, , *= LDBL_MAX, 0,
384 	    LDBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
385 	    0, 0)
386 TEST_FUNCS (long_double_mul_overflow_float, long double, , *= FLT_MAX, 0,
387 	    LDBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
388 	    0, 0)
389 TEST_FUNCS (long_double_mul_overflow_double, long double, , *= DBL_MAX, 0,
390 	    LDBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
391 	    0, 0)
392 TEST_FUNCS (long_double_mul_underflow, long double, , *= LDBL_MIN, 0,
393 	    LDBL_MIN, IS_0, FE_UNDERFLOW | FE_INEXACT,
394 	    1, 0)
395 #if LDBL_MANT_DIG != 106
396 TEST_FUNCS (long_double_mul_inexact, long double, , *= 1 + LDBL_EPSILON, 0,
397 	    1 + LDBL_EPSILON, NOT_0, FE_INEXACT,
398 	    0, 0)
399 TEST_FUNCS (long_double_mul_inexact_int, long double, , *= 3, 0,
400 	    1 + LDBL_EPSILON, NOT_0, FE_INEXACT,
401 	    0, 0)
402 #endif
403 TEST_FUNCS (complex_long_double_mul_overflow, _Complex long double, , *= LDBL_MAX, 0,
404 	    LDBL_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
405 	    0, 0)
406 TEST_FUNCS (long_double_div_invalid_divbyzero, long double, , /= 0.0L, 0,
407 	    1, __builtin_isinf, FE_DIVBYZERO,
408 	    0, FE_INVALID)
409 TEST_FUNCS (long_double_div_overflow, long double, , /= LDBL_MIN, 0,
410 	    LDBL_MAX, __builtin_isinf, FE_OVERFLOW | FE_INEXACT,
411 	    0, 0)
412 TEST_FUNCS (long_double_div_underflow, long double, , /= LDBL_MAX, 0,
413 	    LDBL_MIN, IS_0, FE_UNDERFLOW | FE_INEXACT,
414 	    LDBL_MAX, 0)
415 TEST_FUNCS (long_double_div_inexact, long double, , /= 3.0L, 0,
416 	    1, NOT_0, FE_INEXACT,
417 	    0, 0)
418 TEST_FUNCS (long_double_div_inexact_int, long double, , /= 3, 0,
419 	    1, NOT_0, FE_INEXACT,
420 	    0, 0)
421 TEST_FUNCS (int_div_long_double_inexact, int, , /= 3.0L, 0,
422 	    4, NOT_0, FE_INEXACT,
423 	    0, 0)
424 TEST_FUNCS (complex_long_double_div_overflow, _Complex long double, , /= LDBL_MIN, 0,
425 	    LDBL_MAX, REAL_ISINF, FE_OVERFLOW | FE_INEXACT,
426 	    0, 0)
427 
428 int
main(void)429 main (void)
430 {
431   int ret = 0;
432   ret |= test_main_float_add_invalid ();
433   ret |= test_main_float_add_invalid_prev ();
434   ret |= test_main_float_add_overflow ();
435   ret |= test_main_float_add_overflow_prev ();
436   ret |= test_main_float_add_overflow_double ();
437   ret |= test_main_float_add_overflow_long_double ();
438   ret |= test_main_float_add_inexact ();
439   ret |= test_main_float_add_inexact_int ();
440   ret |= test_main_float_preinc_inexact ();
441   ret |= test_main_float_postinc_inexact ();
442 #if FLT_EVAL_METHOD == 0
443   ret |= test_main_long_add_float_inexact ();
444 #endif
445   ret |= test_main_complex_float_add_overflow ();
446   ret |= test_main_float_sub_invalid ();
447   ret |= test_main_float_sub_overflow ();
448   ret |= test_main_float_sub_inexact ();
449   ret |= test_main_float_sub_inexact_int ();
450   ret |= test_main_float_predec_inexact ();
451   ret |= test_main_float_postdec_inexact ();
452 #if FLT_EVAL_METHOD == 0
453   ret |= test_main_long_sub_float_inexact ();
454 #endif
455   ret |= test_main_complex_float_sub_overflow ();
456   ret |= test_main_float_mul_invalid ();
457   ret |= test_main_float_mul_overflow ();
458   ret |= test_main_float_mul_underflow ();
459   ret |= test_main_float_mul_inexact ();
460   ret |= test_main_float_mul_inexact_int ();
461 #if FLT_EVAL_METHOD == 0
462   ret |= test_main_long_mul_float_inexact ();
463 #endif
464   ret |= test_main_complex_float_mul_overflow ();
465   ret |= test_main_float_div_invalid_divbyzero ();
466   ret |= test_main_float_div_overflow ();
467   ret |= test_main_float_div_underflow ();
468   ret |= test_main_float_div_inexact ();
469   ret |= test_main_float_div_inexact_int ();
470   ret |= test_main_int_div_float_inexact ();
471   ret |= test_main_complex_float_div_overflow ();
472   ret |= test_main_double_add_invalid ();
473   ret |= test_main_double_add_overflow ();
474   ret |= test_main_double_add_overflow_long_double ();
475   ret |= test_main_double_add_inexact ();
476   ret |= test_main_double_add_inexact_int ();
477   ret |= test_main_double_preinc_inexact ();
478   ret |= test_main_double_postinc_inexact ();
479 #if FLT_EVAL_METHOD == 0
480   ret |= test_main_long_long_add_double_inexact ();
481 #endif
482   ret |= test_main_complex_double_add_overflow ();
483   ret |= test_main_double_sub_invalid ();
484   ret |= test_main_double_sub_overflow ();
485   ret |= test_main_double_sub_inexact ();
486   ret |= test_main_double_sub_inexact_int ();
487   ret |= test_main_double_predec_inexact ();
488   ret |= test_main_double_postdec_inexact ();
489 #if FLT_EVAL_METHOD == 0
490   ret |= test_main_long_long_sub_double_inexact ();
491 #endif
492   ret |= test_main_complex_double_sub_overflow ();
493   ret |= test_main_double_mul_invalid ();
494   ret |= test_main_double_mul_overflow ();
495   ret |= test_main_double_mul_overflow_float ();
496   ret |= test_main_double_mul_underflow ();
497   ret |= test_main_double_mul_inexact ();
498   ret |= test_main_double_mul_inexact_int ();
499 #if FLT_EVAL_METHOD == 0
500   ret |= test_main_long_long_mul_double_inexact ();
501 #endif
502   ret |= test_main_complex_double_mul_overflow ();
503   ret |= test_main_double_div_invalid_divbyzero ();
504   ret |= test_main_double_div_overflow ();
505   ret |= test_main_double_div_underflow ();
506   ret |= test_main_double_div_inexact ();
507   ret |= test_main_double_div_inexact_int ();
508   ret |= test_main_int_div_double_inexact ();
509   ret |= test_main_complex_double_div_overflow ();
510   ret |= test_main_long_double_add_invalid ();
511 #if LDBL_MANT_DIG != 106
512   ret |= test_main_long_double_add_overflow ();
513   ret |= test_main_long_double_add_inexact ();
514   ret |= test_main_long_double_add_inexact_int ();
515   ret |= test_main_long_double_preinc_inexact ();
516   ret |= test_main_long_double_postinc_inexact ();
517   ret |= test_main_complex_long_double_add_overflow ();
518 #endif
519   ret |= test_main_long_double_sub_invalid ();
520 #if LDBL_MANT_DIG != 106
521   ret |= test_main_long_double_sub_overflow ();
522   ret |= test_main_long_double_sub_inexact ();
523   ret |= test_main_long_double_sub_inexact_int ();
524   ret |= test_main_long_double_predec_inexact ();
525   ret |= test_main_long_double_postdec_inexact ();
526   ret |= test_main_complex_long_double_sub_overflow ();
527 #endif
528   ret |= test_main_long_double_mul_invalid ();
529   ret |= test_main_long_double_mul_overflow ();
530   ret |= test_main_long_double_mul_overflow_float ();
531   ret |= test_main_long_double_mul_overflow_double ();
532   ret |= test_main_long_double_mul_underflow ();
533 #if LDBL_MANT_DIG != 106
534   ret |= test_main_long_double_mul_inexact ();
535   ret |= test_main_long_double_mul_inexact_int ();
536 #endif
537   ret |= test_main_complex_long_double_mul_overflow ();
538   ret |= test_main_long_double_div_invalid_divbyzero ();
539   ret |= test_main_long_double_div_overflow ();
540   ret |= test_main_long_double_div_underflow ();
541   ret |= test_main_long_double_div_inexact ();
542   ret |= test_main_long_double_div_inexact_int ();
543   ret |= test_main_int_div_long_double_inexact ();
544   ret |= test_main_complex_long_double_div_overflow ();
545   if (ret != 0)
546     abort ();
547   else
548     exit (0);
549 }
550