1  /* { dg-do run } */
       2  /* { dg-options "-fsanitize=signed-integer-overflow -fno-sanitize-recover=signed-integer-overflow" } */
       3  
       4  #ifndef ASM1
       5  # define ASM1(a) /* Nothing */
       6  #endif
       7  #ifndef ASM2
       8  # define ASM2(a, b) /* Nothing */
       9  #endif
      10  
      11  #define CHECK(A, B) ({ if ((A) != (B)) __builtin_abort (); })
      12  
      13  #define FN1(T1, T2, OP)				\
      14    ({						\
      15      T1 a = 14;					\
      16      T2 b = 9;					\
      17      ASM2 (a, b);				\
      18      a OP b;					\
      19    })
      20  
      21  #define FN2(T, OP)				\
      22    ({						\
      23      T a = 14;					\
      24      ASM1 (a);					\
      25      a OP 7;					\
      26    })
      27  
      28  #define FN3(T1, T2, OP)				\
      29    ({						\
      30      T1 a = 4;					\
      31      T2 b = 1;					\
      32      ASM2 (a, b);				\
      33      ~a OP b;					\
      34    })
      35  
      36  #define FN4(T1, T2, OP)				\
      37    ({						\
      38      T1 a = 4;					\
      39      T2 b = 1;					\
      40      ASM2 (a, b);				\
      41      a OP ~b;					\
      42    })
      43  
      44  #define FN5(T)					\
      45    ({						\
      46      T a = 77;					\
      47      ASM1 (a);					\
      48      -a;						\
      49    })
      50  
      51  int
      52  main (void)
      53  {
      54    CHECK (FN1 (char, char, +), 23);
      55    CHECK (FN1 (char, char, -), 5);
      56    CHECK (FN1 (char, char, *), 126);
      57    CHECK (FN1 (unsigned char, unsigned char, +), 23);
      58    CHECK (FN1 (unsigned char, unsigned char, -), 5);
      59    CHECK (FN1 (unsigned char, unsigned char, *), 126);
      60    CHECK (FN1 (short, short, +), 23);
      61    CHECK (FN1 (short, short, -), 5);
      62    CHECK (FN1 (short, short, *), 126);
      63    CHECK (FN1 (unsigned short, unsigned short, +), 23);
      64    CHECK (FN1 (unsigned short, unsigned short, -), 5);
      65    CHECK (FN1 (unsigned short, unsigned short, *), 126);
      66    CHECK (FN1 (int, int, +), 23);
      67    CHECK (FN1 (int, int, -), 5);
      68    CHECK (FN1 (int, int, *), 126);
      69    CHECK (FN1 (unsigned int, unsigned int, +), 23);
      70    CHECK (FN1 (unsigned int, unsigned int, -), 5);
      71    CHECK (FN1 (unsigned int, unsigned int, *), 126);
      72    CHECK (FN1 (long int, long int, +), 23);
      73    CHECK (FN1 (long int, long int, -), 5);
      74    CHECK (FN1 (long int, long int, *), 126);
      75    CHECK (FN1 (unsigned long int, unsigned long int, +), 23);
      76    CHECK (FN1 (unsigned long int, unsigned long int, -), 5);
      77    CHECK (FN1 (unsigned long int, unsigned long int, *), 126);
      78    CHECK (FN1 (long long int, long int, +), 23);
      79    CHECK (FN1 (long long int, long int, -), 5);
      80    CHECK (FN1 (long long int, long int, *), 126);
      81    CHECK (FN1 (unsigned long long int, unsigned long long int, +), 23);
      82    CHECK (FN1 (unsigned long long int, unsigned long long int, -), 5);
      83    CHECK (FN1 (unsigned long long int, unsigned long long int, *), 126);
      84    CHECK (FN1 (int, unsigned char, +), 23);
      85    CHECK (FN1 (int, unsigned char, -), 5);
      86    CHECK (FN1 (int, unsigned char, *), 126);
      87    CHECK (FN1 (unsigned char, int, +), 23);
      88    CHECK (FN1 (unsigned char, int, -), 5);
      89    CHECK (FN1 (unsigned char, int, *), 126);
      90    CHECK (FN1 (int, long int, +), 23);
      91    CHECK (FN1 (int, long int, -), 5);
      92    CHECK (FN1 (int, long int, *), 126);
      93    CHECK (FN1 (long int, int, +), 23);
      94    CHECK (FN1 (long int, int, -), 5);
      95    CHECK (FN1 (long int, int, *), 126);
      96    CHECK (FN1 (unsigned int, int, +), 23);
      97    CHECK (FN1 (unsigned int, int, -), 5);
      98    CHECK (FN1 (unsigned int, int, *), 126);
      99    CHECK (FN1 (int, unsigned int, +), 23);
     100    CHECK (FN1 (int, unsigned int, -), 5);
     101    CHECK (FN1 (int, unsigned int, *), 126);
     102    CHECK (FN1 (unsigned long int, int, +), 23);
     103    CHECK (FN1 (unsigned long int, int, -), 5);
     104    CHECK (FN1 (unsigned long int, int, *), 126);
     105    CHECK (FN1 (int, unsigned long int, +), 23);
     106    CHECK (FN1 (int, unsigned long int, -), 5);
     107    CHECK (FN1 (int, unsigned long int, *), 126);
     108  
     109    CHECK (FN2 (char, +), 21);
     110    CHECK (FN2 (char, -), 7);
     111    CHECK (FN2 (char, *), 98);
     112    CHECK (FN2 (unsigned char, +), 21);
     113    CHECK (FN2 (unsigned char, -), 7);
     114    CHECK (FN2 (unsigned char, *), 98);
     115    CHECK (FN2 (short, +), 21);
     116    CHECK (FN2 (short, -), 7);
     117    CHECK (FN2 (short, *), 98);
     118    CHECK (FN2 (unsigned short, +), 21);
     119    CHECK (FN2 (unsigned short, -), 7);
     120    CHECK (FN2 (unsigned short, *), 98);
     121    CHECK (FN2 (int, +), 21);
     122    CHECK (FN2 (int, -), 7);
     123    CHECK (FN2 (int, *), 98);
     124    CHECK (FN2 (unsigned int, +), 21);
     125    CHECK (FN2 (unsigned int, -), 7);
     126    CHECK (FN2 (unsigned int, *), 98);
     127    CHECK (FN2 (long int, +), 21);
     128    CHECK (FN2 (long int, -), 7);
     129    CHECK (FN2 (long int, *), 98);
     130    CHECK (FN2 (unsigned long int, +), 21);
     131    CHECK (FN2 (unsigned long int, -), 7);
     132    CHECK (FN2 (unsigned long int, *), 98);
     133    CHECK (FN2 (long long int, +), 21);
     134    CHECK (FN2 (long long int, -), 7);
     135    CHECK (FN2 (long long int, *), 98);
     136    CHECK (FN2 (unsigned long long int, +), 21);
     137    CHECK (FN2 (unsigned long long int, -), 7);
     138    CHECK (FN2 (unsigned long long int, *), 98);
     139  
     140    CHECK (FN3 (char, char, +), -4);
     141    CHECK (FN3 (char, char, -), -6);
     142    CHECK (FN3 (char, char, *), -5);
     143    CHECK (FN3 (unsigned char, unsigned char, +), -4);
     144    CHECK (FN3 (unsigned char, unsigned char, -), -6);
     145    CHECK (FN3 (unsigned char, unsigned char, *), -5);
     146    CHECK (FN3 (short, short, +), -4);
     147    CHECK (FN3 (short, short, -), -6);
     148    CHECK (FN3 (short, short, *), -5);
     149    CHECK (FN3 (unsigned short, unsigned short, +), -4);
     150    CHECK (FN3 (unsigned short, unsigned short, -), -6);
     151    CHECK (FN3 (unsigned short, unsigned short, *), -5);
     152    CHECK (FN3 (int, int, +), -4);
     153    CHECK (FN3 (int, int, -), -6);
     154    CHECK (FN3 (int, int, *), -5);
     155    CHECK (FN3 (unsigned int, unsigned int, +), -4);
     156    CHECK (FN3 (unsigned int, unsigned int, -), -6);
     157    CHECK (FN3 (unsigned int, unsigned int, *), -5);
     158    CHECK (FN3 (long int, long int, +), -4);
     159    CHECK (FN3 (long int, long int, -), -6);
     160    CHECK (FN3 (long int, long int, *), -5);
     161    CHECK (FN3 (unsigned long int, unsigned long int, +), -4);
     162    CHECK (FN3 (unsigned long int, unsigned long int, -), -6);
     163    CHECK (FN3 (unsigned long int, unsigned long int, *), -5);
     164    CHECK (FN3 (long long int, long int, +), -4);
     165    CHECK (FN3 (long long int, long int, -), -6);
     166    CHECK (FN3 (long long int, long int, *), -5);
     167    CHECK (FN3 (unsigned long long int, unsigned long long int, +), -4);
     168    CHECK (FN3 (unsigned long long int, unsigned long long int, -), -6);
     169    CHECK (FN3 (unsigned long long int, unsigned long long int, *), -5);
     170    CHECK (FN3 (int, unsigned char, +), -4);
     171    CHECK (FN3 (int, unsigned char, -), -6);
     172    CHECK (FN3 (int, unsigned char, *), -5);
     173    CHECK (FN3 (unsigned char, int, +), -4);
     174    CHECK (FN3 (unsigned char, int, -), -6);
     175    CHECK (FN3 (unsigned char, int, *), -5);
     176    CHECK (FN3 (int, long int, +), -4);
     177    CHECK (FN3 (int, long int, -), -6);
     178    CHECK (FN3 (int, long int, *), -5);
     179    CHECK (FN3 (long int, int, +), -4);
     180    CHECK (FN3 (long int, int, -), -6);
     181    CHECK (FN3 (long int, int, *), -5);
     182    CHECK (FN3 (unsigned int, int, +), -4);
     183    CHECK (FN3 (unsigned int, int, -), -6);
     184    CHECK (FN3 (unsigned int, int, *), -5);
     185    CHECK (FN3 (int, unsigned int, +), -4);
     186    CHECK (FN3 (int, unsigned int, -), -6);
     187    CHECK (FN3 (int, unsigned int, *), -5);
     188    CHECK (FN3 (unsigned long int, int, +), -4);
     189    CHECK (FN3 (unsigned long int, int, -), -6);
     190    CHECK (FN3 (unsigned long int, int, *), -5);
     191    CHECK (FN3 (int, unsigned long int, +), -4);
     192    CHECK (FN3 (int, unsigned long int, -), -6);
     193    CHECK (FN3 (int, unsigned long int, *), -5);
     194  
     195    CHECK (FN4 (char, char, +), 2);
     196    CHECK (FN4 (char, char, -), 6);
     197    CHECK (FN4 (char, char, *), -8);
     198    CHECK (FN4 (unsigned char, unsigned char, +), 2);
     199    CHECK (FN4 (unsigned char, unsigned char, -), 6);
     200    CHECK (FN4 (unsigned char, unsigned char, *), -8);
     201    CHECK (FN4 (short, short, +), 2);
     202    CHECK (FN4 (short, short, -), 6);
     203    CHECK (FN4 (short, short, *), -8);
     204    CHECK (FN4 (unsigned short, unsigned short, +), 2);
     205    CHECK (FN4 (unsigned short, unsigned short, -), 6);
     206    CHECK (FN4 (unsigned short, unsigned short, *), -8);
     207    CHECK (FN4 (int, int, +), 2);
     208    CHECK (FN4 (int, int, -), 6);
     209    CHECK (FN4 (int, int, *), -8);
     210    CHECK (FN4 (unsigned int, unsigned int, +), 2);
     211    CHECK (FN4 (unsigned int, unsigned int, -), 6);
     212    CHECK (FN4 (unsigned int, unsigned int, *), -8);
     213    CHECK (FN4 (long int, long int, +), 2);
     214    CHECK (FN4 (long int, long int, -), 6);
     215    CHECK (FN4 (long int, long int, *), -8);
     216    CHECK (FN4 (unsigned long int, unsigned long int, +), 2);
     217    CHECK (FN4 (unsigned long int, unsigned long int, -), 6);
     218    CHECK (FN4 (unsigned long int, unsigned long int, *), -8);
     219    CHECK (FN4 (long long int, long int, +), 2);
     220    CHECK (FN4 (long long int, long int, -), 6);
     221    CHECK (FN4 (long long int, long int, *), -8);
     222    CHECK (FN4 (unsigned long long int, unsigned long long int, +), 2);
     223    CHECK (FN4 (unsigned long long int, unsigned long long int, -), 6);
     224    CHECK (FN4 (unsigned long long int, unsigned long long int, *), -8);
     225    CHECK (FN4 (int, unsigned char, +), 2);
     226    CHECK (FN4 (int, unsigned char, -), 6);
     227    CHECK (FN4 (int, unsigned char, *), -8);
     228    CHECK (FN4 (unsigned char, int, +), 2);
     229    CHECK (FN4 (unsigned char, int, -), 6);
     230    CHECK (FN4 (unsigned char, int, *), -8);
     231    CHECK (FN4 (int, long int, +), 2);
     232    CHECK (FN4 (int, long int, -), 6);
     233    CHECK (FN4 (int, long int, *), -8);
     234    CHECK (FN4 (long int, int, +), 2);
     235    CHECK (FN4 (long int, int, -), 6);
     236    CHECK (FN4 (long int, int, *), -8);
     237    CHECK (FN4 (unsigned int, int, +), 2);
     238    CHECK (FN4 (unsigned int, int, -), 6);
     239    CHECK (FN4 (unsigned int, int, *), -8);
     240    CHECK (FN4 (int, unsigned int, +), 2);
     241    CHECK (FN4 (int, unsigned int, -), 6);
     242    CHECK (FN4 (int, unsigned int, *), -8);
     243    CHECK (FN4 (unsigned long int, int, +), 2);
     244    CHECK (FN4 (unsigned long int, int, -), 6);
     245    CHECK (FN4 (unsigned long int, int, *), -8);
     246    CHECK (FN4 (int, unsigned long int, +), 2);
     247    CHECK (FN4 (int, unsigned long int, -), 6);
     248    CHECK (FN4 (int, unsigned long int, *), -8);
     249  
     250    CHECK (FN5 (char), -77);
     251    CHECK (FN5 (unsigned char), -77);
     252    CHECK (FN5 (short), -77);
     253    CHECK (FN5 (unsigned short), -77);
     254    CHECK (FN5 (int), -77);
     255    CHECK (FN5 (unsigned int), -77);
     256    CHECK (FN5 (long int), -77);
     257    CHECK (FN5 (unsigned long int), -77);
     258    CHECK (FN5 (long long int), -77);
     259    CHECK (FN5 (unsigned long long int), -77);
     260    return 0;
     261  }