/* { dg-do run { target { *-*-linux* *-*-gnu* } } } */ /* { dg-options "-O1 -lm -fexcess-precision=standard -fsignaling-nans" } */ /* { dg-add-options ieee } */ /* { dg-require-effective-target issignaling } */ #define _GNU_SOURCE #include #include void conversion() { float sNaN = __builtin_nansf (""); double x = (double) sNaN; if (issignaling(x)) { __builtin_abort(); } } enum op {Add, Mult, Div, Abs}; void operation(enum op t) { float x, y; float sNaN = __builtin_nansf (""); switch (t) { case Abs: x = fabs(sNaN); break; case Add: x = sNaN + 2.0; break; case Mult: x = sNaN * 2.0; break; case Div: default: x = sNaN / 2.0; break; } if (t == Abs) { if (!issignaling(x)) { __builtin_abort(); } } else if (issignaling(x)) { __builtin_abort(); } } int main (void) { conversion(); operation(Add); operation(Mult); operation(Div); #if __FLT_EVAL_METHOD__ == 0 operation(Abs); #endif return 0; }