2 /* { dg-add-options ieee } */
3 /* { dg-require-effective-target fenv_exceptions } */
9 extern void abort (void) __attribute__ ((noreturn
));
11 #define LARGE_NEG_MAYBE_ERANGE 0x01
12 #define LARGE_NEG_ERANGE 0x02
13 #define LARGE_POS_ERANGE 0x04
14 #define LARGE_NEG_EDOM 0x08
15 #define LARGE_POS_EDOM 0x10
17 #define LARGE_ERANGE (LARGE_NEG_ERANGE | LARGE_POS_ERANGE)
18 #define LARGE_EDOM (LARGE_NEG_EDOM | LARGE_POS_EDOM)
19 #define POWER_ERANGE (LARGE_NEG_MAYBE_ERANGE | LARGE_POS_ERANGE)
21 #define TEST(CALL, FLAGS) (CALL, tester (FLAGS))
26 static void (*tester
) (int);
29 check_quiet_nan (int flags
__attribute__ ((unused
)))
31 if (fetestexcept (FE_ALL_EXCEPT
))
38 check_large_neg (int flags
)
40 if (flags
& LARGE_NEG_MAYBE_ERANGE
)
42 int expected_errno
= (flags
& LARGE_NEG_ERANGE
? ERANGE
43 : flags
& LARGE_NEG_EDOM
? EDOM
45 if (expected_errno
!= errno
)
51 check_large_pos (int flags
)
53 int expected_errno
= (flags
& LARGE_POS_ERANGE
? ERANGE
54 : flags
& LARGE_POS_EDOM
? EDOM
56 if (expected_errno
!= errno
)
64 TEST (acos (d
), LARGE_EDOM
);
65 TEST (asin (d
), LARGE_EDOM
);
66 TEST (acosh (d
), LARGE_NEG_EDOM
);
67 TEST (atanh (d
), LARGE_EDOM
);
68 TEST (cosh (d
), LARGE_ERANGE
);
69 TEST (sinh (d
), LARGE_ERANGE
);
70 TEST (log (d
), LARGE_NEG_EDOM
);
71 #if defined (__sun__) && defined (__unix__)
72 /* Disabled due to a bug in Solaris libm. */
75 TEST (log2 (d
), LARGE_NEG_EDOM
);
76 TEST (log10 (d
), LARGE_NEG_EDOM
);
77 #if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 22))
78 /* Disabled due to glibc PR 6792, fixed in glibc 2.22. */
81 TEST (log1p (d
), LARGE_NEG_EDOM
);
82 TEST (exp (d
), POWER_ERANGE
);
83 #if (defined (__sun__) || defined(__hppa__)) && defined (__unix__)
84 /* Disabled due to a bug in Solaris libm. HP PA-RISC libm doesn't support
89 TEST (exp2 (d
), POWER_ERANGE
);
90 #if defined(__GLIBC__) && (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 11))
91 /* Disabled due to glibc PR 6788, fixed in glibc 2.11. */
94 TEST (expm1 (d
), POWER_ERANGE
);
96 TEST (sqrt (d
), LARGE_NEG_EDOM
);
97 TEST (pow (100.0, d
), POWER_ERANGE
);
98 TEST (pow (i
, d
), POWER_ERANGE
);
106 d
= __builtin_nan ("");
107 tester
= check_quiet_nan
;
108 feclearexcept (FE_ALL_EXCEPT
);
112 tester
= check_large_neg
;
117 tester
= check_large_pos
;