1  #define SCHAR_MAX __SCHAR_MAX__
       2  #define SCHAR_MIN (-__SCHAR_MAX__ - 1)
       3  #define SHRT_MAX __SHRT_MAX__
       4  #define SHRT_MIN (-__SHRT_MAX__ - 1)
       5  #define INT_MAX __INT_MAX__
       6  #define INT_MIN (-__INT_MAX__ - 1)
       7  #define LONG_MAX __LONG_MAX__
       8  #define LONG_MIN (-__LONG_MAX__ - 1)
       9  #define LLONG_MAX __LONG_LONG_MAX__
      10  #define LLONG_MIN (-__LONG_LONG_MAX__ - 1)
      11  
      12  int v;
      13  
      14  __attribute__((noinline, noclone)) void
      15  bar (void)
      16  {
      17    v++;
      18  }
      19  
      20  #define T(n, t1, t2, tr, v1, v2, vr, b, o) \
      21  __attribute__((noinline, noclone)) tr		\
      22  t##n##_1##b (t1 x, t2 y)			\
      23  {						\
      24    tr r;						\
      25    if (__builtin_##b##_overflow (x, y, &r))	\
      26      bar ();					\
      27    return r;					\
      28  }						\
      29  						\
      30  __attribute__((noinline, noclone)) tr		\
      31  t##n##_2##b (t2 y)				\
      32  {						\
      33    t1 x = (v1);					\
      34    tr r;						\
      35    if (__builtin_##b##_overflow (x, y, &r))	\
      36      bar ();					\
      37    return r;					\
      38  }						\
      39  						\
      40  __attribute__((noinline, noclone)) tr		\
      41  t##n##_3##b (t2 y)				\
      42  {						\
      43    tr r;						\
      44    if (__builtin_##b##_overflow ((t1) (v1), y,	\
      45  				&r))		\
      46      bar ();					\
      47    return r;					\
      48  }						\
      49  						\
      50  __attribute__((noinline, noclone)) tr		\
      51  t##n##_4##b (t1 x)				\
      52  {						\
      53    t2 y = (v2);					\
      54    tr r;						\
      55    if (__builtin_##b##_overflow (x, y, &r))	\
      56      bar ();					\
      57    return r;					\
      58  }						\
      59  						\
      60  __attribute__((noinline, noclone)) tr		\
      61  t##n##_5##b (t1 x)				\
      62  {						\
      63    tr r;						\
      64    if (__builtin_##b##_overflow (x, (t2) (v2),	\
      65  				&r))		\
      66      bar ();					\
      67    return r;					\
      68  }						\
      69  						\
      70  __attribute__((noinline, noclone)) void		\
      71  t##n##b (void)					\
      72  {						\
      73    t1 x = (v1);					\
      74    t2 y = (v2);					\
      75    tr r1, r2;					\
      76    v = 0;					\
      77    if (t##n##_1##b (x, y) != (tr) (vr)		\
      78        || t##n##_2##b (y) != (tr) (vr)		\
      79        || t##n##_3##b (y) != (tr) (vr)		\
      80        || t##n##_4##b (x) != (tr) (vr)		\
      81        || t##n##_5##b (x) != (tr) (vr))		\
      82      __builtin_abort ();				\
      83    if (__builtin_##b##_overflow (x, y, &r1))	\
      84      bar ();					\
      85    if (r1 != (tr) (vr))				\
      86      __builtin_abort ();				\
      87    if (__builtin_##b##_overflow ((t1) (v1),	\
      88  				(t2) (v2), &r2))\
      89      bar ();					\
      90    if (r2 != (tr) (vr) || v != 7 * o)		\
      91      __builtin_abort ();				\
      92  }
      93  #define TP(n, t1, t2, er, v1, v2, b, o) \
      94  __attribute__((noinline, noclone)) void		\
      95  t##n##_1##b (t1 x, t2 y)			\
      96  {						\
      97    if (__builtin_##b##_overflow_p (x, y, er))	\
      98      bar ();					\
      99  }						\
     100  						\
     101  __attribute__((noinline, noclone)) void		\
     102  t##n##_2##b (t2 y)				\
     103  {						\
     104    t1 x = (v1);					\
     105    if (__builtin_##b##_overflow_p (x, y, er))	\
     106      bar ();					\
     107  }						\
     108  						\
     109  __attribute__((noinline, noclone)) void		\
     110  t##n##_3##b (t2 y)				\
     111  {						\
     112    if (__builtin_##b##_overflow_p ((t1) (v1), y,	\
     113  				  er))		\
     114      bar ();					\
     115  }						\
     116  						\
     117  __attribute__((noinline, noclone)) void		\
     118  t##n##_4##b (t1 x)				\
     119  {						\
     120    t2 y = (v2);					\
     121    if (__builtin_##b##_overflow_p (x, y, er))	\
     122      bar ();					\
     123  }						\
     124  						\
     125  __attribute__((noinline, noclone)) void		\
     126  t##n##_5##b (t1 x)				\
     127  {						\
     128    if (__builtin_##b##_overflow_p (x, (t2) (v2),	\
     129  				  er))		\
     130      bar ();					\
     131  }						\
     132  						\
     133  __attribute__((noinline, noclone)) void		\
     134  t##n##b (void)					\
     135  {						\
     136    t1 x = (v1);					\
     137    t2 y = (v2);					\
     138    v = 0;					\
     139    t##n##_1##b (x, y);				\
     140    t##n##_2##b (y);				\
     141    t##n##_3##b (y);				\
     142    t##n##_4##b (x);				\
     143    t##n##_5##b (x);				\
     144    if (__builtin_##b##_overflow_p (x, y, er))	\
     145      bar ();					\
     146    if (__builtin_##b##_overflow_p ((t1) (v1),	\
     147  				  (t2) (v2),	\
     148  				  er))		\
     149      bar ();					\
     150    if (v != 7 * o)				\
     151      __builtin_abort ();				\
     152  }
     153  #ifdef OVFP
     154  #undef T
     155  #define T(n, t1, t2, tr, v1, v2, vr, b, o) \
     156  TP(n, t1, t2, (tr) 0, v1, v2, b, o)
     157  #endif
     158  #define ST(n, t, v1, v2, vr, b, o) \
     159  T (n, t, t, t, v1, v2, vr, b, o)