(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
builtin-arith-overflow-2.c
       1  /* PR c/68120 - can't easily deal with integer overflow at compile time */
       2  /* { dg-do run } */
       3  /* { dg-additional-options "-Wno-long-long" } */
       4  /* { dg-skip-if "Program too big" { "avr-*-* pdp11*-*-*" } } */
       5  
       6  #define SCHAR_MAX    __SCHAR_MAX__
       7  #define SHRT_MAX     __SHRT_MAX__
       8  #define INT_MAX	     __INT_MAX__
       9  #define LONG_MAX     __LONG_MAX__
      10  #define LLONG_MAX    __LONG_LONG_MAX__
      11  	
      12  #define SCHAR_MIN    (-__SCHAR_MAX__ - 1)
      13  #define SHRT_MIN     (-__SHRT_MAX__ - 1)
      14  #define INT_MIN	     (-__INT_MAX__ - 1)
      15  #define LONG_MIN     (-__LONG_MAX__ - 1)
      16  #define LLONG_MIN    (-__LONG_LONG_MAX__ - 1)
      17  	
      18  #define UCHAR_MAX    (SCHAR_MAX * 2U + 1)
      19  #define USHRT_MAX    (SHRT_MAX * 2U + 1)
      20  #define UINT_MAX     (INT_MAX * 2U + 1)
      21  #define ULONG_MAX    (LONG_MAX * 2LU + 1)
      22  #define ULLONG_MAX   (LLONG_MAX * 2LLU + 1)
      23  	
      24  #define USCHAR_MIN   (-__USCHAR_MAX__ - 1)
      25  #define USHRT_MIN    (-__USHRT_MAX__ - 1)
      26  #define UINT_MIN     (-__UINT_MAX__ - 1)
      27  #define ULONG_MIN    (-__ULONG_MAX__ - 1)
      28  #define ULLONG_MIN   (-__ULONG_LONG_MAX__ - 1)
      29  
      30  /* Number of failed runtime assertions.  */
      31  int nfails;
      32  
      33  void __attribute__ ((noclone, noinline))
      34  runtime_assert (int expr, int line)
      35  {
      36    if (!expr)
      37      {
      38        __builtin_printf ("line %i: assertion failed\n", line);
      39        ++nfails;
      40      }
      41  }
      42  
      43  /* Helper macros for run-time testing.  */
      44  #define add(x, y) ((x) + (y))
      45  #define sadd(x, y) ((x) + (y))
      46  #define saddl(x, y) ((x) + (y))
      47  #define saddll(x, y) ((x) + (y))
      48  #define uadd(x, y) ((x) + (y))
      49  #define uaddl(x, y) ((x) + (y))
      50  #define uaddll(x, y) ((x) + (y))
      51  #define sub(x, y) ((x) - (y))
      52  #define ssub(x, y) ((x) - (y))
      53  #define ssubl(x, y) ((x) - (y))
      54  #define ssubll(x, y) ((x) - (y))
      55  #define usub(x, y) ((x) - (y))
      56  #define usubl(x, y) ((x) - (y))
      57  #define usubll(x, y) ((x) - (y))
      58  #define mul(x, y) ((x) * (y))
      59  #define smul(x, y) ((x) * (y))
      60  #define smull(x, y) ((x) * (y))
      61  #define smulll(x, y) ((x) * (y))
      62  #define umul(x, y) ((x) * (y))
      63  #define umull(x, y) ((x) * (y))
      64  #define umulll(x, y) ((x) * (y))
      65  
      66  int main (void)
      67  {
      68  
      69  #if __cplusplus >= 201103L
      70  #  define StaticAssert(expr) static_assert ((expr), #expr)
      71  #elif __STDC_VERSION__ >= 201112L
      72  #  define StaticAssert(expr) _Static_assert ((expr), #expr)
      73  #else
      74    /* The following pragma has no effect due to bug 70888 - #pragma
      75       diagnostic ignored -Wlong-long ineffective with __LONG_LONG_MAX__
      76       in c++98 mode.  */
      77  #  pragma GCC diagnostic ignored "-Wlong-long"
      78  #  pragma GCC diagnostic ignored "-Wunused-local-typedefs"
      79  
      80  #  define CONCAT(a, b)  a ## b
      81  #  define CAT(a, b)     CONCAT (a, b)
      82  #  define StaticAssert(expr)					\
      83       typedef int CAT (StaticAssert_, __LINE__) [1 - 2 * !(expr)]
      84  #endif
      85  
      86    /* Make extra effort to prevent constant folding seeing the constant
      87       values of the arguments and optimizing the run-time test into
      88       a constant.  */
      89  #define RuntimeAssert(op, T, U, x, y, vflow)				\
      90    do {									\
      91      volatile T a = (x), b = (y);					\
      92      U c = 0;								\
      93      volatile int vf = __builtin_ ## op ## _overflow (a, b, &c);		\
      94      runtime_assert ((vf == vflow), __LINE__);				\
      95      if (vf == 0)							\
      96        runtime_assert (op (a, b) == c, __LINE__);			\
      97    } while (0)
      98  
      99    /* Verify that each call to the type-generic __builtin_op_overflow(x, y)
     100       yields a constant expression equal to z indicating whether or not
     101       the constant expression (x op y) overflows when evaluated in type T.  */
     102  #  define G_TEST(op, T, x, y, vflow)					\
     103    RuntimeAssert(op, __typeof__ (op (x, y)), T, x, y, vflow);		\
     104    StaticAssert ((vflow) == __builtin_ ## op ## _overflow_p ((x), (y), (T)0))
     105  
     106    /* Addition.  */
     107    G_TEST (add, signed char,    0,         0,         0);
     108    G_TEST (add, signed char,    0,         SCHAR_MAX, 0);
     109    G_TEST (add, signed char,    1,         SCHAR_MAX, 1);
     110    G_TEST (add, signed char,    SCHAR_MAX, SCHAR_MAX, 1);
     111    G_TEST (add, signed char,    0,         SCHAR_MIN, 0);
     112    G_TEST (add, signed char,   -1,         SCHAR_MIN, 1);
     113    /* Verify any slicing in the result type doesn't prevent the overflow
     114       from being detected.  */
     115    G_TEST (add, signed char,    UCHAR_MAX + 1, 0,     1);
     116    G_TEST (add, signed char,    UCHAR_MAX + 1, 1,     1);
     117    G_TEST (add, signed char,    1, UCHAR_MAX + 1,     1);
     118  
     119    G_TEST (add, unsigned char,  0,        0,          0);
     120    /* Verify any slicing in the result type doesn't prevent the overflow
     121       from being detected.  */
     122    G_TEST (add, unsigned char,  UCHAR_MAX + 1, 0,     1);
     123    G_TEST (add, unsigned char,  UCHAR_MAX + 1, 1,     1);
     124    G_TEST (add, unsigned char,  1, UCHAR_MAX + 1,     1);
     125  
     126    G_TEST (add, short,          0,         0,         0);
     127    G_TEST (add, short,          0,         SHRT_MAX,  0);
     128    G_TEST (add, short,          1,         SHRT_MAX,  1);
     129    G_TEST (add, short,          SHRT_MAX,  SHRT_MAX,  1);
     130    G_TEST (add, short,          0,         SHRT_MIN,  0);
     131    G_TEST (add, short,         -1,         SHRT_MIN,  1);
     132    G_TEST (add, short,          SHRT_MIN,  SHRT_MIN,  1);
     133  
     134    G_TEST (add, int,            0,         0,         0);
     135    G_TEST (add, int,            0,         INT_MAX,   0);
     136    G_TEST (add, int,            1,         INT_MAX,   1);
     137    G_TEST (add, int,            INT_MAX,   INT_MAX,   1);
     138    G_TEST (add, int,            0,         INT_MIN,   0);
     139    G_TEST (add, int,           -1,         INT_MIN,   1);
     140    G_TEST (add, int,            INT_MIN,   INT_MIN,   1);
     141  
     142    G_TEST (add, long,           0,         0,         0);
     143    G_TEST (add, long,           0,         LONG_MAX,  0);
     144    G_TEST (add, long,           1,         LONG_MAX,  1);
     145    G_TEST (add, long,           LONG_MAX,  LONG_MAX,  1);
     146    G_TEST (add, long,           0,         LONG_MIN,  0);
     147    G_TEST (add, long,          -1,         LONG_MIN,  1);
     148    G_TEST (add, long,           LONG_MIN,  LONG_MIN,  1);
     149  
     150    G_TEST (add, long long,      0,         0,          0);
     151    G_TEST (add, long long,      0,         LLONG_MAX,  0);
     152    G_TEST (add, long long,      1,         LLONG_MAX,  1);
     153    G_TEST (add, long long,      LLONG_MAX, LLONG_MAX,  1);
     154    G_TEST (add, long long,      0,         LLONG_MIN,  0);
     155    G_TEST (add, long long,     -1,         LLONG_MIN,  1);
     156    G_TEST (add, long long,      LLONG_MIN, LLONG_MIN,  1);
     157  
     158    /* Subtraction */
     159    G_TEST (sub, unsigned char,  0,         0,          0);
     160    G_TEST (sub, unsigned char,  0,         UCHAR_MAX,  1);
     161    G_TEST (sub, unsigned char,  1,         UCHAR_MAX,  1);
     162  
     163    G_TEST (sub, unsigned char,  UCHAR_MAX, UCHAR_MAX,  0);
     164    G_TEST (sub, unsigned short, 0,         0,          0);
     165    G_TEST (sub, unsigned short, 0,         USHRT_MAX,  1);
     166    G_TEST (sub, unsigned short, 1,         USHRT_MAX,  1);
     167    G_TEST (sub, unsigned short, USHRT_MAX, USHRT_MAX,  0);
     168  
     169    G_TEST (sub, unsigned,       0,         0,          0);
     170    G_TEST (sub, unsigned,       0,         UINT_MAX,   1);
     171    G_TEST (sub, unsigned,       1,         UINT_MAX,   1);
     172    G_TEST (sub, unsigned,       UINT_MAX,  UINT_MAX,   0);
     173  
     174    G_TEST (sub, unsigned long,  0,         0,          0);
     175    G_TEST (sub, unsigned long,  0,         ULONG_MAX,  1);
     176    G_TEST (sub, unsigned long,  1,         ULONG_MAX,  1);
     177    G_TEST (sub, unsigned long,  ULONG_MAX, ULONG_MAX,  0);
     178  
     179    G_TEST (sub, unsigned long long,  0,          0,          0);
     180    G_TEST (sub, unsigned long long,  0,          ULLONG_MAX, 1);
     181    G_TEST (sub, unsigned long long,  1,          ULLONG_MAX, 1);
     182    G_TEST (sub, unsigned long long,  ULLONG_MAX, ULLONG_MAX, 0);
     183  
     184    G_TEST (sub, signed char,    0,         0,           0);
     185    G_TEST (sub, signed char,    0,         SCHAR_MAX,   0);
     186    G_TEST (sub, signed char,    1,         SCHAR_MAX,   0);
     187    G_TEST (sub, signed char,    SCHAR_MAX, SCHAR_MAX,   0);
     188    G_TEST (sub, signed char,    SCHAR_MIN,         1,   1);
     189    G_TEST (sub, signed char,    0,         SCHAR_MIN,   1);
     190    G_TEST (sub, signed char,   -1,         SCHAR_MIN,   0);
     191  
     192    G_TEST (sub, short,          0,         0,           0);
     193    G_TEST (sub, short,          0,         SHRT_MAX,    0);
     194    G_TEST (sub, short,          1,         SHRT_MAX,    0);
     195    G_TEST (sub, short,          SHRT_MAX,  SHRT_MAX,    0);
     196    G_TEST (sub, short,          0,         SHRT_MIN,    1);
     197    G_TEST (sub, short,         -1,         SHRT_MIN,    0);
     198    G_TEST (sub, short,          SHRT_MIN,  SHRT_MIN,    0);
     199  
     200    G_TEST (sub, int,            0,         0,           0);
     201    G_TEST (sub, int,            0,         INT_MAX,     0);
     202    G_TEST (sub, int,            1,         INT_MAX,     0);
     203    G_TEST (sub, int,            INT_MAX,   INT_MAX,     0);
     204    G_TEST (sub, int,            0,         INT_MIN,     1);
     205    G_TEST (sub, int,           -1,         INT_MIN,     0);
     206    G_TEST (sub, int,            INT_MIN,   INT_MIN,     0);
     207  
     208    G_TEST (sub, long,           0,         0,           0);
     209    G_TEST (sub, long,           0,         LONG_MAX,    0);
     210    G_TEST (sub, long,           1,         LONG_MAX,    0);
     211    G_TEST (sub, long,           LONG_MAX,  LONG_MAX,    0);
     212    G_TEST (sub, long,           0,         LONG_MIN,    1);
     213    G_TEST (sub, long,          -1,         LONG_MIN,    0);
     214    G_TEST (sub, long,           LONG_MIN,  LONG_MIN,    0);
     215  
     216    G_TEST (sub, long long,      0,           0,           0);
     217    G_TEST (sub, long long,      0,           LLONG_MAX,   0);
     218    G_TEST (sub, long long,      1,           LLONG_MAX,   0);
     219    G_TEST (sub, long long,      LLONG_MAX,   LLONG_MAX,   0);
     220    G_TEST (sub, long long,      0,           LLONG_MIN,   1);
     221    G_TEST (sub, long long,     -1,           LLONG_MIN,   0);
     222    G_TEST (sub, long long,      LLONG_MIN,   LLONG_MIN,   0);
     223  
     224    G_TEST (sub, unsigned char,  0,         0,          0);
     225    G_TEST (sub, unsigned char,  0,         UCHAR_MAX,  1);
     226    G_TEST (sub, unsigned char,  1,         UCHAR_MAX,  1);
     227    G_TEST (sub, unsigned char,  UCHAR_MAX, UCHAR_MAX,  0);
     228  
     229    G_TEST (sub, unsigned short, 0,         0,          0);
     230    G_TEST (sub, unsigned short, 0,         USHRT_MAX,  1);
     231    G_TEST (sub, unsigned short, 1,         USHRT_MAX,  1);
     232    G_TEST (sub, unsigned short, USHRT_MAX, USHRT_MAX,  0);
     233  
     234    G_TEST (sub, unsigned,       0,         0,          0);
     235    G_TEST (sub, unsigned,       0,         UINT_MAX,   1);
     236    G_TEST (sub, unsigned,       1,         UINT_MAX,   1);
     237    G_TEST (sub, unsigned,       UINT_MAX,  UINT_MAX,   0);
     238  
     239    G_TEST (sub, unsigned long,  0,         0,          0);
     240    G_TEST (sub, unsigned long,  0,         ULONG_MAX,  1);
     241    G_TEST (sub, unsigned long,  1,         ULONG_MAX,  1);
     242    G_TEST (sub, unsigned long,  ULONG_MAX, ULONG_MAX,  0);
     243  
     244    G_TEST (sub, unsigned long long,  0,          0,          0);
     245    G_TEST (sub, unsigned long long,  0,          ULLONG_MAX, 1);
     246    G_TEST (sub, unsigned long long,  1,          ULLONG_MAX, 1);
     247    G_TEST (sub, unsigned long long,  ULLONG_MAX, ULLONG_MAX, 0);
     248  
     249    /* Multiplication.  */
     250    G_TEST (mul, unsigned char,  0,         0,          0);
     251    G_TEST (mul, unsigned char,  0,         UCHAR_MAX,  0);
     252    G_TEST (mul, unsigned char,  1,         UCHAR_MAX,  0);
     253    G_TEST (mul, unsigned char,  2,         UCHAR_MAX,  1);
     254    G_TEST (mul, unsigned char,  UCHAR_MAX, UCHAR_MAX,  1);
     255  
     256    G_TEST (mul, unsigned short, 0,         0,          0);
     257    G_TEST (mul, unsigned short, 0,         USHRT_MAX,  0);
     258    G_TEST (mul, unsigned short, 1,         USHRT_MAX,  0);
     259    G_TEST (mul, unsigned short, USHRT_MAX, 2,          1);
     260    G_TEST (mul, unsigned short, USHRT_MAX, USHRT_MAX,  1);
     261  
     262    G_TEST (mul, unsigned,       0,         0,          0);
     263    G_TEST (mul, unsigned,       0,         UINT_MAX,   0);
     264    G_TEST (mul, unsigned,       1,         UINT_MAX,   0);
     265    G_TEST (mul, unsigned,       2,         UINT_MAX,   1);
     266    G_TEST (mul, unsigned,       UINT_MAX,  UINT_MAX,   1);
     267  
     268    G_TEST (mul, unsigned long,  0,         0,          0);
     269    G_TEST (mul, unsigned long,  0,         ULONG_MAX,  0);
     270    G_TEST (mul, unsigned long,  1,         ULONG_MAX,  0);
     271    G_TEST (mul, unsigned long,  2,         ULONG_MAX,  1);
     272    G_TEST (mul, unsigned long,  ULONG_MAX, ULONG_MAX,  1);
     273  
     274    G_TEST (mul, unsigned long long,  0,          0,          0);
     275    G_TEST (mul, unsigned long long,  0,          ULLONG_MAX, 0);
     276    G_TEST (mul, unsigned long long,  1,          ULLONG_MAX, 0);
     277    G_TEST (mul, unsigned long long,  2,          ULLONG_MAX, 1);
     278    G_TEST (mul, unsigned long long,  ULLONG_MAX, ULLONG_MAX, 1);
     279  
     280    G_TEST (mul, signed char,  0,         0,           0);
     281    G_TEST (mul, signed char,  0,         SCHAR_MAX,   0);
     282    G_TEST (mul, signed char,  1,         SCHAR_MAX,   0);
     283    G_TEST (mul, signed char,  SCHAR_MAX, SCHAR_MAX,   1);
     284    G_TEST (mul, signed char,  SCHAR_MIN,         1,   0);
     285    G_TEST (mul, signed char,  0,         SCHAR_MIN,   0);
     286    G_TEST (mul, signed char, -1,         SCHAR_MIN,   1);
     287  
     288    G_TEST (mul, short,        0,         0,           0);
     289    G_TEST (mul, short,        0,         SHRT_MAX,    0);
     290    G_TEST (mul, short,        1,         SHRT_MAX,    0);
     291    G_TEST (mul, short,        SHRT_MAX,  SHRT_MAX,    1);
     292    G_TEST (mul, short,        0,         SHRT_MIN,    0);
     293    G_TEST (mul, short,       -1,         SHRT_MIN,    1);
     294    G_TEST (mul, short,        SHRT_MIN,  SHRT_MIN,    1);
     295  
     296    G_TEST (mul, int,          0,         0,           0);
     297    G_TEST (mul, int,          0,         INT_MAX,     0);
     298    G_TEST (mul, int,          1,         INT_MAX,     0);
     299    G_TEST (mul, int,          INT_MAX,   INT_MAX,     1);
     300    G_TEST (mul, int,          0,         INT_MIN,     0);
     301    G_TEST (mul, int,         -1,         INT_MIN,     1);
     302    G_TEST (mul, int,          INT_MIN,   INT_MIN,     1);
     303  
     304    G_TEST (mul, long,         0,         0,           0);
     305    G_TEST (mul, long,         0,         LONG_MAX,    0);
     306    G_TEST (mul, long,         1,         LONG_MAX,    0);
     307    G_TEST (mul, long,         LONG_MAX,  LONG_MAX,    1);
     308    G_TEST (mul, long,         0,         LONG_MIN,    0);
     309    G_TEST (mul, long,        -1,         LONG_MIN,    1);
     310    G_TEST (mul, long,         LONG_MIN,  LONG_MIN,    1);
     311  
     312    G_TEST (mul, long long,    0,           0,           0);
     313    G_TEST (mul, long long,    0,           LLONG_MAX,   0);
     314    G_TEST (mul, long long,    1,           LLONG_MAX,   0);
     315    G_TEST (mul, long long,    LLONG_MAX,   LLONG_MAX,   1);
     316    G_TEST (mul, long long,    0,           LLONG_MIN,   0);
     317    G_TEST (mul, long long,   -1,           LLONG_MIN,   1);
     318    G_TEST (mul, long long,    LLONG_MIN,   LLONG_MIN,   1);
     319  
     320    G_TEST (mul, unsigned char,  0,         0,          0);
     321    G_TEST (mul, unsigned char,  0,         UCHAR_MAX,  0);
     322    G_TEST (mul, unsigned char,  1,         UCHAR_MAX,  0);
     323    G_TEST (mul, unsigned char,  UCHAR_MAX, UCHAR_MAX,  1);
     324  
     325    G_TEST (mul, unsigned short, 0,         0,          0);
     326    G_TEST (mul, unsigned short, 0,         USHRT_MAX,  0);
     327    G_TEST (mul, unsigned short, 1,         USHRT_MAX,  0);
     328    G_TEST (mul, unsigned short, USHRT_MAX, USHRT_MAX,  1);
     329  
     330    G_TEST (mul, unsigned,       0,         0,          0);
     331    G_TEST (mul, unsigned,       0,         UINT_MAX,   0);
     332    G_TEST (mul, unsigned,       1,         UINT_MAX,   0);
     333    G_TEST (mul, unsigned,       UINT_MAX,  UINT_MAX,   1);
     334  
     335    G_TEST (mul, unsigned long,  0,         0,          0);
     336    G_TEST (mul, unsigned long,  0,         ULONG_MAX,  0);
     337    G_TEST (mul, unsigned long,  1,         ULONG_MAX,  0);
     338    G_TEST (mul, unsigned long,  ULONG_MAX, ULONG_MAX,  1);
     339  
     340    G_TEST (mul, unsigned long long,  0,          0,          0);
     341    G_TEST (mul, unsigned long long,  0,          ULLONG_MAX, 0);
     342    G_TEST (mul, unsigned long long,  1,          ULLONG_MAX, 0);
     343    G_TEST (mul, unsigned long long,  ULLONG_MAX, ULLONG_MAX, 1);
     344  
     345    /* Verify that each call to the type-specific __builtin_op_overflow
     346       evaluates to a (not-necessarily constant) expression indicating
     347       whether or not the constant expression (x op y) overflows.
     348       The type-specific forms of the built-ins detect overflow after
     349       arithmetic promotions and so unlike the type-generic overloads
     350       cannot detect overflow in char or short types.  */
     351  
     352  #define T_TEST(op, T, x, y, vflow)				\
     353    RuntimeAssert (op, T, __typeof__ ((x) + (y)), x, y, vflow)
     354  
     355    /* Signed int addition.  */
     356    T_TEST (sadd,   signed char,    0,         0,         0);
     357    T_TEST (sadd,   signed char,    0,         SCHAR_MAX, 0);
     358    T_TEST (sadd,   signed char,    1,         SCHAR_MAX, 0);
     359    T_TEST (sadd,   signed char,    SCHAR_MAX, SCHAR_MAX, 0);
     360    T_TEST (sadd,   signed char,    0,         SCHAR_MIN, 0);
     361    T_TEST (sadd,   signed char,   -1,         SCHAR_MIN, 0);
     362  
     363    T_TEST (sadd,   short,          0,         0,         0);
     364    T_TEST (sadd,   short,          0,         SHRT_MAX,  0);
     365    T_TEST (sadd,   short,          1,         SHRT_MAX,  0);
     366    T_TEST (sadd,   short,          SHRT_MAX,  SHRT_MAX,  0);
     367    T_TEST (sadd,   short,          0,         SHRT_MIN,  0);
     368    T_TEST (sadd,   short,         -1,         SHRT_MIN,  0);
     369    T_TEST (sadd,   short,          SHRT_MIN,  SHRT_MIN,  0);
     370  
     371    T_TEST (sadd,   int,            0,         0,         0);
     372    T_TEST (sadd,   int,            0,         INT_MAX,   0);
     373    T_TEST (sadd,   int,            1,         INT_MAX,   1);
     374    T_TEST (sadd,   int,            INT_MAX,   INT_MAX,   1);
     375    T_TEST (sadd,   int,            0,         INT_MIN,   0);
     376    T_TEST (sadd,   int,           -1,         INT_MIN,   1);
     377    T_TEST (sadd,   int,            INT_MIN,   INT_MIN,   1);
     378  
     379    /* Signed long addition.  */
     380    T_TEST (saddl,  long,           0L,        0L,        0);
     381    T_TEST (saddl,  long,           0L,        LONG_MAX,  0);
     382    T_TEST (saddl,  long,           1L,        LONG_MAX,  1);
     383    T_TEST (saddl,  long,           LONG_MAX,  LONG_MAX,  1);
     384    T_TEST (saddl,  long,           0L,        LONG_MIN,  0);
     385    T_TEST (saddl,  long,          -1L,        LONG_MIN,  1);
     386    T_TEST (saddl,  long,           LONG_MIN,  LONG_MIN,  1);
     387  
     388    T_TEST (saddll, long long,      0LL,       0LL,        0);
     389    T_TEST (saddll, long long,      0LL,       LLONG_MAX,  0);
     390    T_TEST (saddll, long long,      1LL,       LLONG_MAX,  1);
     391    T_TEST (saddll, long long,      LLONG_MAX, LLONG_MAX,  1);
     392    T_TEST (saddll, long long,      0LL,       LLONG_MIN,  0);
     393    T_TEST (saddll, long long,     -1LL,       LLONG_MIN,  1);
     394    T_TEST (saddll, long long,      LLONG_MIN, LLONG_MIN,  1);
     395  
     396    /* Unsigned int addition.  */
     397    T_TEST (uadd,   unsigned char,  0U,        0U,         0);
     398    T_TEST (uadd,   unsigned char,  0U,        UCHAR_MAX, 0);
     399    T_TEST (uadd,   unsigned char,  1U,        UCHAR_MAX, 0);
     400    T_TEST (uadd,   unsigned char,  UCHAR_MAX, UCHAR_MAX, 0);
     401  
     402    T_TEST (uadd,   unsigned short, 0U,        0U,         0);
     403    T_TEST (uadd,   unsigned short, 0U,        USHRT_MAX,  0);
     404    T_TEST (uadd,   unsigned short, 1U,        USHRT_MAX,  0);
     405    T_TEST (uadd,   unsigned short, USHRT_MAX, USHRT_MAX,  0);
     406  
     407    T_TEST (uadd,   unsigned,       0U,        0U,         0);
     408    T_TEST (uadd,   unsigned,       0U,        UINT_MAX,   0);
     409    T_TEST (uadd,   unsigned,       1U,        UINT_MAX,   1);
     410    T_TEST (uadd,   unsigned,       UINT_MAX,  UINT_MAX,   1);
     411  
     412    /* Unsigned long addition.  */
     413    T_TEST (uaddl,  unsigned long,  0UL,       0UL,       0);
     414    T_TEST (uaddl,  unsigned long,  0UL,       ULONG_MAX, 0);
     415    T_TEST (uaddl,  unsigned long,  1UL,       ULONG_MAX, 1);
     416    T_TEST (uaddl,  unsigned long,  ULONG_MAX, ULONG_MAX, 1);
     417  
     418    T_TEST (uaddll, unsigned long long, 0ULL,       0ULL,       0);
     419    T_TEST (uaddll, unsigned long long, 0ULL,       ULLONG_MAX, 0);
     420    T_TEST (uaddll, unsigned long long, 1ULL,       ULLONG_MAX, 1);
     421    T_TEST (uaddll, unsigned long long, ULLONG_MAX, ULLONG_MAX, 1);
     422  
     423    /* Signed int subtraction.  */
     424    T_TEST (ssub,   signed char,    0,         0,          0);
     425    T_TEST (ssub,   signed char,    0,         SCHAR_MAX,  0);
     426    T_TEST (ssub,   signed char,    1,         SCHAR_MAX,  0);
     427    T_TEST (ssub,   signed char,    SCHAR_MAX, SCHAR_MAX,  0);
     428    T_TEST (ssub,   signed char,    0,         SCHAR_MIN,  0);
     429    T_TEST (ssub,   signed char,   -1,         SCHAR_MIN,  0);
     430  
     431    T_TEST (ssub,   short,          0,         0,          0);
     432    T_TEST (ssub,   short,          0,         SHRT_MAX,   0);
     433    T_TEST (ssub,   short,          1,         SHRT_MAX,   0);
     434    T_TEST (ssub,   short,          SHRT_MAX,  SHRT_MAX,   0);
     435    T_TEST (ssub,   short,          0,         SHRT_MIN,   0);
     436    T_TEST (ssub,   short,         -1,         SHRT_MIN,   0);
     437    T_TEST (ssub,   short,          SHRT_MIN,  SHRT_MIN,   0);
     438  
     439    T_TEST (ssub,   int,            0,         0,          0);
     440    T_TEST (ssub,   int,            0,         INT_MAX,    0);
     441    T_TEST (ssub,   int,            1,         INT_MAX,    0);
     442    T_TEST (ssub,   int,            INT_MAX,   INT_MAX,    0);
     443    T_TEST (ssub,   int,            0,         INT_MIN,    1);
     444    T_TEST (ssub,   int,           -1,         INT_MIN,    0);
     445    T_TEST (ssub,   int,            INT_MIN,   INT_MIN,    0);
     446  
     447    /* Signed long subtraction.  */
     448    T_TEST (ssubl,  long,           0L,        0L,         0);
     449    T_TEST (ssubl,  long,           0L,        LONG_MAX,   0);
     450    T_TEST (ssubl,  long,           1L,        LONG_MAX,   0);
     451    T_TEST (ssubl,  long,           LONG_MAX,  LONG_MAX,   0);
     452    T_TEST (ssubl,  long,           0L,        LONG_MIN,   1);
     453    T_TEST (ssubl,  long,          -1L,        LONG_MIN,   0);
     454    T_TEST (ssubl,  long,           LONG_MIN,  LONG_MIN,   0);
     455  
     456    /* Signed long long subtraction.  */
     457    T_TEST (ssubll, long long,      0LL,       0LL,        0);
     458    T_TEST (ssubll, long long,      0LL,       LLONG_MAX,  0);
     459    T_TEST (ssubll, long long,      1LL,       LLONG_MAX,  0);
     460    T_TEST (ssubll, long long,      LLONG_MAX, LLONG_MAX,  0);
     461    T_TEST (ssubll, long long,      0LL,       LLONG_MIN,  1);
     462    T_TEST (ssubll, long long,     -1LL,       LLONG_MIN,  0);
     463    T_TEST (ssubll, long long,      LLONG_MIN, LLONG_MIN,  0);
     464  
     465    /* Unsigned int subtraction.  */
     466    T_TEST (usub,   unsigned char,  0U,        0U,         0);
     467    T_TEST (usub,   unsigned char,  0U,        UCHAR_MAX,  1);
     468    T_TEST (usub,   unsigned char,  1U,        UCHAR_MAX,  1);
     469    T_TEST (usub,   unsigned char,  UCHAR_MAX, UCHAR_MAX,  0);
     470  
     471    T_TEST (usub,   unsigned short, 0U,        0U,         0);
     472    T_TEST (usub,   unsigned short, 0U,        USHRT_MAX,  1);
     473    T_TEST (usub,   unsigned short, 1U,        USHRT_MAX,  1);
     474    T_TEST (usub,   unsigned short, USHRT_MAX, USHRT_MAX,  0);
     475  
     476    T_TEST (usub,   unsigned,       0U,        0U,         0);
     477    T_TEST (usub,   unsigned,       0U,        UINT_MAX,   1);
     478    T_TEST (usub,   unsigned,       1U,        UINT_MAX,   1);
     479    T_TEST (usub,   unsigned,       UINT_MAX,  UINT_MAX,   0);
     480  
     481    /* Unsigned long subtraction.  */
     482    T_TEST (usubl,  unsigned long,  0UL,       0UL,       0);
     483    T_TEST (usubl,  unsigned long,  0UL,       ULONG_MAX, 1);
     484    T_TEST (usubl,  unsigned long,  1UL,       ULONG_MAX, 1);
     485    T_TEST (usubl,  unsigned long,  ULONG_MAX, ULONG_MAX, 0);
     486  
     487    /* Unsigned long long subtraction.  */
     488    T_TEST (usubll, unsigned long long,  0ULL,       0ULL,       0);
     489    T_TEST (usubll, unsigned long long,  0ULL,       ULLONG_MAX, 1);
     490    T_TEST (usubll, unsigned long long,  1ULL,       ULLONG_MAX, 1);
     491    T_TEST (usubll, unsigned long long,  ULLONG_MAX, ULLONG_MAX, 0);
     492  
     493    return 0;
     494  }