https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94439

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Slightly reduced testcase:
extern void exit (int);
extern void abort (void);

#define COMPARE_BODY(A, B, TYPE, COPYSIGN)                              \
  do {                                                                  \
    TYPE s1 = COPYSIGN ((TYPE) 1.0, A);                                 \
    TYPE s2 = COPYSIGN ((TYPE) 1.0, B);                                 \
    if (s1 != s2)                                                       \
      abort ();                                                         \
    if ((__builtin_isnan (A) != 0) != (__builtin_isnan (B) != 0))       \
      abort ();                                                         \
    if ((A != B) != (__builtin_isnan (A) != 0))                         \
      abort ();                                                         \
  } while (0)

void
comparel (long double a, long double b)
{
  COMPARE_BODY (a, b, long double, __builtin_copysignl);
}

void
comparecl (_Complex long double a, long double r, long double i)
{
  comparel (__real__ a, r);
  comparel (__imag__ a, i);
}

#define VERIFY(A, B, TYPE, COMPARE)                     \
  do {                                                  \
    TYPE a = A;                                         \
    TYPE b = B;                                         \
    _Complex TYPE cr = __builtin_complex (a, b);        \
    static _Complex TYPE cs = __builtin_complex (A, B); \
    COMPARE (cr, A, B);                                 \
    COMPARE (cs, A, B);                                 \
  } while (0)

#define ALL_CHECKS(PZ, NZ, NAN, INF, TYPE, COMPARE)     \
  do {                                                  \
    VERIFY (NAN, NZ, TYPE, COMPARE);                    \
    VERIFY (INF, NZ, TYPE, COMPARE);                    \
    VERIFY (INF, NAN, TYPE, COMPARE);                   \
    VERIFY (INF, INF, TYPE, COMPARE);                   \
  } while (0)

void
check_long_double (void)
{
  ALL_CHECKS (0.0l, -0.0l, __builtin_nanl(""), __builtin_infl(), long double,
comparecl);
}

Reply via email to