1  /* Test __builtin_{add,sub,mul}_overflow_p.  */
       2  /* { dg-do run } */
       3  /* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
       4  
       5  #include "builtin-arith-overflow.h"
       6  
       7  #ifdef __SIZEOF_INT128__
       8  #define WTYPE __int128
       9  #else
      10  #define WTYPE long long int
      11  #endif
      12  
      13  struct S
      14  {
      15    signed int s1 : 1;
      16    unsigned int u1 : 1;
      17    signed int s2 : 2;
      18    unsigned int u2 : 2;
      19    signed int s3 : 3;
      20    unsigned int u3 : 3;
      21    signed int s4 : 4;
      22    unsigned int u4 : 4;
      23    signed int s5 : 5;
      24    unsigned int u5 : 5;
      25    signed int s6 : 6;
      26    unsigned int u6 : 6;
      27    signed int s7 : 7;
      28    unsigned int u7 : 7;
      29  } vs;
      30  
      31  #define TESTS \
      32  TP (100, signed char, signed char, vs.u2, -1, 0, add, 1) \
      33  TP (101, unsigned char, unsigned char, vs.u4, 5, 5, add, 0) \
      34  TP (102, unsigned char, unsigned char, vs.u3, 5, 3, add, 1) \
      35  TP (103, signed char, unsigned short, vs.u1, 5, 5, sub, 0) \
      36  TP (104, signed char, unsigned short, vs.u1, 6, 5, sub, 0) \
      37  TP (105, signed char, unsigned short, vs.u1, 7, 5, sub, 1) \
      38  TP (106, signed char, unsigned short, vs.u4, 5, 6, sub, 1) \
      39  TP (107, signed char, signed char, vs.u1, -1, -1, mul, 0) \
      40  TP (108, signed char, signed char, vs.s1, -1, -1, mul, 1) \
      41  TP (109, unsigned char, signed char, vs.u6, 17, -2, mul, 1) \
      42  TP (110, unsigned char, signed char, vs.s6, 17, -2, mul, 1) \
      43  TP (111, unsigned char, signed char, vs.s7, 17, -2, mul, 0) \
      44  TP (112, unsigned WTYPE, signed WTYPE, vs.s5, 5, -2, mul, 0) \
      45  TP (113, unsigned WTYPE, signed WTYPE, vs.s4, 5, -2, mul, 1) \
      46  TP (114, long long int, long long int, vs.u2, -3, 5, add, 0) \
      47  TP (115, long long int, long long int, vs.u1, -3, 5, add, 1) \
      48  TP (116, long long int, int, vs.u3, -5, 3, add, 1) \
      49  TP (117, long long int, int, vs.s1, -5, 3, add, 1) \
      50  TP (118, long long int, int, vs.s2, -5, 3, add, 0) \
      51  TP (119, int, WTYPE, vs.u2, -3, 5, add, 0) \
      52  TP (120, int, WTYPE, vs.u1, -3, 5, add, 1) \
      53  TP (121, unsigned char, unsigned char, vs.u6, SCHAR_MAX - 1, (unsigned char) SCHAR_MAX + 4, sub, 1) \
      54  TP (122, unsigned char, unsigned char, vs.s3, SCHAR_MAX - 1, (unsigned char) SCHAR_MAX + 4, sub, 1) \
      55  TP (123, unsigned char, unsigned char, vs.s4, SCHAR_MAX - 1, (unsigned char) SCHAR_MAX + 4, sub, 0) \
      56  TP (124, unsigned int, unsigned int, vs.u7, INT_MAX, 1, add, 1) \
      57  TP (125, unsigned int, unsigned int, vs.u7, 127, 1, add, 1) \
      58  TP (126, unsigned int, unsigned int, vs.u7, 1, 63, add, 0) \
      59  TP (127, int, int, vs.s7, INT_MIN, 1, sub, 1) \
      60  TP (128, int, int, vs.s7, -64, 1, sub, 1) \
      61  TP (129, int, int, vs.s7, -63, 1, sub, 0)
      62  
      63  TESTS
      64  
      65  #undef TP
      66  #define TP(n, t1, t2, er, v1, v2, b, o) t##n##b ();
      67  
      68  int
      69  main ()
      70  {
      71    TESTS
      72    return 0;
      73  }