(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
torture/
builtin-sqrt-cmp-1.c
       1  /* { dg-do link } */
       2  /* { dg-options "-ffast-math" } */
       3  /* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
       4  
       5  extern double sqrt (double);
       6  extern float sqrtf (float);
       7  extern long double sqrtl (long double);
       8  
       9  /* All references to link_error should go away at compile-time.  */
      10  extern void link_error (void);
      11  
      12  #define TEST_ONE(SUFFIX, TYPE)			\
      13    void __attribute__ ((noinline, noclone))	\
      14    test##SUFFIX (TYPE f, int *res)		\
      15    {						\
      16      TYPE sqrt_res = sqrt##SUFFIX (f);		\
      17      res[0] = sqrt_res < 0;			\
      18      if (res[0])					\
      19        link_error ();				\
      20      res[1] = sqrt_res <= 0;			\
      21      if (res[1] != (f == 0))			\
      22        link_error ();				\
      23      res[2] = (sqrt_res == 0);			\
      24      if (res[2] != (f == 0))			\
      25        link_error ();				\
      26      res[3] = (sqrt_res != 0);			\
      27      if (res[3] != (f != 0))			\
      28        link_error ();				\
      29      res[4] = (sqrt_res > 0);			\
      30      if (res[4] != (f > 0))			\
      31        link_error ();				\
      32      res[5] = (sqrt_res >= 0);			\
      33      if (!res[5])				\
      34        link_error ();				\
      35    }
      36  
      37  volatile float f;
      38  volatile double d;
      39  volatile long double ld;
      40  
      41  TEST_ONE (f, float)
      42  TEST_ONE (, double)
      43  TEST_ONE (l, long double)
      44  
      45  int
      46  main ()
      47  {
      48    int res[6];
      49    testf (f, res);
      50    test (d, res);
      51    testl (ld, res);
      52    return 0;
      53  }