1  /* Test __builtin_{add,sub}_overflow_p on {,un}signed char.  */
       2  /* { dg-do run } */
       3  /* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
       4  
       5  #define UCHAR_MAX ((unsigned char) ~0)
       6  #ifndef SHIFT
       7  typedef signed char S;
       8  typedef unsigned char U;
       9  typedef int W;
      10  #define SHIFT 0
      11  #define S_MAX __SCHAR_MAX__
      12  #define S_MIN (-__SCHAR_MAX__ - 1)
      13  #define COND (__SIZEOF_INT__ > 1)
      14  #endif
      15  
      16  #define F(n, t1, t2, tr, b) \
      17  __attribute__((noinline, noclone)) void		\
      18  n (t1 x, t2 y, int *ovf)			\
      19  {						\
      20    *ovf = __builtin_##b##_overflow_p (x, y,	\
      21  				     (tr) 0);	\
      22  }
      23  
      24  F (spses, S, S, S, add)
      25  F (upueu, U, U, U, add)
      26  F (spseu, S, S, U, add)
      27  F (upues, U, U, S, add)
      28  F (spues, S, U, S, add)
      29  F (upses, U, S, S, add)
      30  F (spueu, S, U, U, add)
      31  F (upseu, U, S, U, add)
      32  F (ssses, S, S, S, sub)
      33  F (usueu, U, U, U, sub)
      34  F (ssseu, S, S, U, sub)
      35  F (usues, U, U, S, sub)
      36  F (ssues, S, U, S, sub)
      37  F (usses, U, S, S, sub)
      38  F (ssueu, S, U, U, sub)
      39  F (usseu, U, S, U, sub)
      40  
      41  int
      42  main ()
      43  {
      44  #if COND
      45    int i, j;
      46    for (i = 0; i < UCHAR_MAX; i++)
      47      for (j = 0; j < UCHAR_MAX; j++)
      48        {
      49  	S s1 = ((W) i << SHIFT) + S_MIN;
      50  	U u1 = ((W) i << SHIFT);
      51  	S s2 = ((W) j << SHIFT) + S_MIN;
      52  	U u2 = ((W) j << SHIFT);
      53  	W w;
      54  	int ovf;
      55  #define T(n, t1, t2, tr, op) \
      56  	w = ((W) t1##1) op ((W) t2##2);		\
      57  	n (t1##1, t2##2, &ovf);			\
      58  	if (ovf != (w != (tr) w))		\
      59  	  __builtin_abort ();
      60  	T (spses, s, s, S, +)
      61  	T (upueu, u, u, U, +)
      62  	T (spseu, s, s, U, +)
      63  	T (upues, u, u, S, +)
      64  	T (spues, s, u, S, +)
      65  	T (upses, u, s, S, +)
      66  	T (spueu, s, u, U, +)
      67  	T (upseu, u, s, U, +)
      68  	T (ssses, s, s, S, -)
      69  	T (usueu, u, u, U, -)
      70  	T (ssseu, s, s, U, -)
      71  	T (usues, u, u, S, -)
      72  	T (ssues, s, u, S, -)
      73  	T (usses, u, s, S, -)
      74  	T (ssueu, s, u, U, -)
      75  	T (usseu, u, s, U, -)
      76        }
      77  #endif
      78    return 0;
      79  }