1/* { dg-do run } */ 2/* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable -fno-sanitize-recover=signed-integer-overflow" } */ 3 4#define SCHAR_MAX __SCHAR_MAX__ 5#define SHRT_MAX __SHRT_MAX__ 6#define INT_MAX __INT_MAX__ 7#define INT_MIN (-__INT_MAX__ - 1) 8 9void __attribute__((noinline,noclone)) 10check (int i, int j) 11{ 12 if (i != j) 13 __builtin_abort (); 14} 15 16int 17main (void) 18{ 19#if __INT_MAX__ == 2147483647 20 /* Here, nothing should fail. */ 21 volatile int j = INT_MAX; 22 volatile int i = -1; 23 volatile int k = j + i; 24 check (k, 2147483646); 25 k = i + j; 26 check (k, 2147483646); 27 j--; 28 check (j, 2147483646); 29 30 i = 1; 31 j = INT_MIN; 32 k = i + j; 33 check (k, -2147483647); 34 k = j + i; 35 check (k, -2147483647); 36 j++; 37 check (j, -2147483647); 38#endif 39 40 /* Test integer promotion. */ 41#if __SCHAR_MAX__ == 127 42 volatile signed char a = SCHAR_MAX; 43 volatile signed char b = 1; 44 volatile signed char c = a + b; 45 check (c, -128); 46 a++; 47 check (a, -128); 48#endif 49 50#if __SHRT_MAX__ == 32767 51 volatile short d = SHRT_MAX; 52 volatile short e = 1; 53 volatile short f = d + e; 54 check (f, -32768); 55 d++; 56 check (d, -32768); 57#endif 58 return 0; 59} 60