(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
torture/
builtin-nonneg-1.c
       1  /* Copyright (C) 2004  Free Software Foundation.
       2  
       3     Verify that GCC can determine which built-in functions produce a
       4     nonnegative result.
       5  
       6     Written by Kaveh Ghazi, 2004-03-10.  */
       7  
       8  /* { dg-do link } */
       9  /* This test needs more recursion than the default.  PR 68097 is about
      10     adding proper range information for reals, so that no recursion
      11     would be necessary.  */
      12  /* { dg-options "-ffast-math --param max-ssa-name-query-depth=3" } */
      13  /* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
      14  
      15  #define PROTOTYPE_RTYPE(FN,RTYPE) extern RTYPE FN(double); \
      16    extern RTYPE FN##f(float); \
      17    extern RTYPE FN##l(long double);
      18  #define PROTOTYPE(FN) extern double FN(double); extern float FN##f(float); \
      19    extern long double FN##l(long double);
      20  #define PROTOTYPE2(FN) extern double FN(double, double); \
      21    extern float FN##f(float, float); \
      22    extern long double FN##l(long double, long double);
      23  #define CPROTOTYPE1(FN) extern double FN(_Complex double); \
      24    extern float FN##f(_Complex float); \
      25    extern long double FN##l(_Complex long double);
      26  #define CPROTOTYPE1(FN) extern double FN(_Complex double); \
      27    extern float FN##f(_Complex float); \
      28    extern long double FN##l(_Complex long double);
      29  #define IPROTOTYPE(FN) extern int FN(int); extern int FN##l(long); \
      30    extern int FN##ll(long long);
      31  #define PROTOTYPE2TYPE2(FN,A2TYPE) extern double FN(double, A2TYPE); \
      32    extern float FN##f(float, A2TYPE); \
      33    extern long double FN##l(long double, A2TYPE);
      34  #define PROTOTYPE2_A2FPTR(FN) extern double FN(double, double *); \
      35    extern float FN##f(float, float *); \
      36    extern long double FN##l(long double, long double *);
      37  
      38  extern int signbit (double);
      39  extern int signbitf (float);
      40  extern int signbitl (long double);
      41  
      42  void test(double d1, double d2, float f1, float f2,
      43  	  long double ld1, long double ld2)
      44  {
      45    /* These are always nonnegative.  */
      46  
      47  #define TEST1(FN) \
      48   extern void link_failure_##FN (void); PROTOTYPE(FN) \
      49   if (signbit(FN(d1)) || signbitf(FN##f(f1)) || signbitl(FN##l(ld1))) \
      50     link_failure_##FN()
      51  
      52  #define TEST2(FN) \
      53   extern void link_failure_##FN (void); PROTOTYPE2(FN) \
      54   if (signbit(FN(d1,d2)) || signbitf(FN##f(f1,f2)) || signbitl(FN##l(ld1,ld2))) \
      55     link_failure_##FN()
      56  
      57  #define CTEST1(FN) \
      58   extern void link_failure_##FN (void); CPROTOTYPE1(FN) \
      59   if (signbit(FN(d1)) || signbitf(FN##f(f1)) || signbitl(FN##l(ld1))) \
      60     link_failure_##FN()
      61  
      62  #define ITEST1(FN) \
      63   extern void link_failure_##FN (void); IPROTOTYPE(FN) \
      64   if (signbit(FN(d1)) || signbitf(FN##l(f1)) || signbitl(FN##ll(ld1))) \
      65     link_failure_##FN()
      66  
      67    TEST1 (acos);
      68    TEST1 (acosh);
      69    CTEST1 (cabs);
      70    TEST1 (cosh);
      71    TEST1 (erfc);
      72    TEST1 (exp);
      73    TEST1 (exp10);
      74    TEST1 (exp2);
      75    TEST1 (fabs);
      76    TEST2 (fdim);
      77    TEST2 (hypot);
      78    TEST1 (pow10);
      79    TEST1 (sqrt);
      80    ITEST1 (ffs);
      81    ITEST1 (__builtin_parity);
      82    ITEST1 (__builtin_popcount);
      83  
      84    /* These are nonnegative if the first argument is.  */
      85  #define ARG1TEST1(FN) \
      86   extern void link_failure_##FN (void); PROTOTYPE(FN) \
      87   if (signbit(FN(fabs(d1))) || signbitf(FN##f(fabsf(f1))) \
      88       || signbitl(FN##l(fabsl(ld1)))) \
      89     link_failure_##FN()
      90  
      91    /* Same, but allow specifying the return type.  */
      92  #define ARG1TEST1_RTYPE(FN,RTYPE) \
      93   extern void link_failure_##FN (void); PROTOTYPE_RTYPE(FN,RTYPE) \
      94   if (signbit(FN(fabs(d1))) || signbitf(FN##f(fabsf(f1))) \
      95       || signbitl(FN##l(fabsl(ld1)))) \
      96     link_failure_##FN()
      97  
      98    /* These are nonnegative if the first argument is.  */
      99  #define ARG1TEST2(FN) \
     100   extern void link_failure_##FN (void); PROTOTYPE2(FN) \
     101   if (signbit(FN(fabs(d1),d2)) || signbitf(FN##f(fabsf(f1),f2)) \
     102       || signbitl(FN##l(fabsl(ld1),ld2))) \
     103     link_failure_##FN()
     104  
     105    /* These are nonnegative if the second argument is.  */
     106  #define ARG2TEST2(FN) \
     107   extern void link_failure_##FN (void); PROTOTYPE2(FN) \
     108   if (signbit(FN(d1,fabs(d2))) || signbitf(FN##f(f1,fabsf(f2))) \
     109       || signbitl(FN##l(ld1,fabsl(ld2)))) \
     110     link_failure_##FN()
     111  
     112    /* These are nonnegative if the first OR second argument is.  */
     113  #define ARG2TESTor(FN) \
     114   extern void link_failure_##FN (void); PROTOTYPE2(FN) \
     115   if (signbit(FN(fabs(d1),d2)) || signbitf(FN##f(fabsf(f1),f2)) \
     116       || signbitl(FN##l(fabsl(ld1),ld2)) || signbit(FN(d1,fabs(d2))) \
     117       || signbitf(FN##f(f1,fabsf(f2))) || signbitl(FN##l(ld1,fabsl(ld2)))) \
     118     link_failure_##FN()
     119  
     120    /* These are nonnegative if the first AND second argument is.  */
     121  #define ARG2TESTand(FN) \
     122   extern void link_failure_##FN (void); PROTOTYPE2(FN) \
     123   if (signbit(FN(fabs(d1),fabs(d2))) || signbitf(FN##f(fabsf(f1),fabsf(f2))) \
     124       || signbitl(FN##l(fabsl(ld1),fabsl(ld2)))) \
     125     link_failure_##FN()
     126  
     127    /* These are nonnegative if the first argument is, 2nd arg is an int.  */
     128  #define ARG1TEST2_A2INT(FN, INTTYPE) \
     129   extern void link_failure_##FN (void); PROTOTYPE2TYPE2(FN, INTTYPE) \
     130   if (signbit(FN(fabs(d1),d2)) || signbitf(FN##f(fabsf(f1),f2)) \
     131       || signbitl(FN##l(fabsl(ld1),ld2))) \
     132     link_failure_##FN()
     133  
     134    /* These are nonnegative if the first argument is, specify 2nd arg.  */
     135  #define ARG2TEST1_A2FPTR(FN) \
     136   extern void link_failure_##FN (void); PROTOTYPE2_A2FPTR(FN) \
     137   if (signbit(FN(fabs(d1),&d2)) || signbitf(FN##f(fabsf(f1),&f2)) \
     138       || signbitl(FN##l(fabsl(ld1),&ld2))) \
     139     link_failure_##FN()
     140  
     141    ARG1TEST1 (asinh);
     142    ARG1TEST1 (atan);
     143    ARG1TEST1 (atanh);
     144    ARG1TEST1 (cbrt);
     145    ARG1TEST1 (ceil);
     146    ARG1TEST1 (erf);
     147    ARG1TEST1 (expm1);
     148    ARG1TEST1 (floor);
     149    ARG1TEST2 (fmod);
     150    ARG1TEST2_A2INT (ldexp, int);
     151    ARG1TEST1_RTYPE (__builtin_llceil, long long);
     152    ARG1TEST1_RTYPE (__builtin_llfloor, long long);
     153    ARG1TEST1_RTYPE (llrint, long long);
     154    ARG1TEST1_RTYPE (llround, long long);
     155    ARG1TEST1_RTYPE (__builtin_lceil, long);
     156    ARG1TEST1_RTYPE (__builtin_lfloor, long);
     157    ARG1TEST1_RTYPE (lrint, long);
     158    ARG1TEST1_RTYPE (lround, long);
     159    /* The modf* functions aren't ever "const" or "pure" even with
     160       -ffast-math so they won't be eliminated and yield a link failure.  */
     161    /* ARG2TEST1_A2FPTR (modf);*/
     162    ARG1TEST1 (nearbyint);
     163    ARG1TEST2 (pow);
     164    ARG1TEST1 (rint);
     165    ARG1TEST1 (round);
     166    ARG1TEST2 (scalb);
     167    ARG1TEST2_A2INT (scalbln, long);
     168    ARG1TEST2_A2INT (scalbn, int);
     169    ARG1TEST1_RTYPE (signbit, int);
     170    ARG1TEST1 (significand);
     171    ARG1TEST1 (sinh);
     172    ARG1TEST1 (tanh);
     173    ARG1TEST1 (trunc);
     174  
     175    ARG2TESTor (fmax);
     176    ARG2TESTand (fmin);
     177    ARG2TEST2 (copysign);
     178  
     179  }
     180  
     181  int main (void)
     182  {
     183    return 0;
     184  }