| /* { dg-do run } */ |
| /* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable -fno-sanitize-recover=signed-integer-overflow" } */ |
| /* { dg-options "-fsanitize=signed-integer-overflow -Wno-unused-variable -fno-sanitize-recover=signed-integer-overflow -Wno-volatile" { target c++ } } */ |
| |
| #define SCHAR_MAX __SCHAR_MAX__ |
| #define SHRT_MAX __SHRT_MAX__ |
| #define INT_MAX __INT_MAX__ |
| #define INT_MIN (-__INT_MAX__ - 1) |
| |
| void __attribute__((noinline,noclone)) |
| check (int i, int j) |
| { |
| if (i != j) |
| __builtin_abort (); |
| } |
| |
| int |
| main (void) |
| { |
| #if __INT_MAX__ == 2147483647 |
| /* Here, nothing should fail. */ |
| volatile int j = INT_MAX; |
| volatile int i = -1; |
| volatile int k = j + i; |
| check (k, 2147483646); |
| k = i + j; |
| check (k, 2147483646); |
| j--; |
| check (j, 2147483646); |
| |
| i = 1; |
| j = INT_MIN; |
| k = i + j; |
| check (k, -2147483647); |
| k = j + i; |
| check (k, -2147483647); |
| j++; |
| check (j, -2147483647); |
| #endif |
| |
| /* Test integer promotion. */ |
| #if __SCHAR_MAX__ == 127 |
| volatile signed char a = SCHAR_MAX; |
| volatile signed char b = 1; |
| volatile signed char c = a + b; |
| check (c, -128); |
| a++; |
| check (a, -128); |
| #endif |
| |
| #if __SHRT_MAX__ == 32767 |
| volatile short d = SHRT_MAX; |
| volatile short e = 1; |
| volatile short f = d + e; |
| check (f, -32768); |
| d++; |
| check (d, -32768); |
| #endif |
| return 0; |
| } |