/* { 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 SCHAR_MIN (-__SCHAR_MAX__ - 1) #define SHRT_MAX __SHRT_MAX__ #define SHRT_MIN (-__SHRT_MAX__ - 1) #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 i = -1; volatile int j = INT_MIN; volatile int k = j - i; check (k, -2147483647); k = i - j; check (k, 2147483647); j++; check (j, -2147483647); i = 1; j = INT_MAX; k = i - j; check (k, -2147483646); k = j - i; check (k, 2147483646); j--; check (k, 2147483646); #endif /* Test integer promotion. */ #if __SCHAR_MAX__ == 127 volatile signed char a = SCHAR_MIN; volatile signed char b = 1; volatile signed char c = a - b; check (c, 127); a--; check (a, 127); #endif #if __SHRT_MAX__ == 32767 volatile short d = SHRT_MIN; volatile short e = 1; volatile short f = d - e; check (f, 32767); d--; check (d, 32767); #endif return 0; }