1 /* { dg-do run } */ 2 /* { dg-options "-O2" } */ 3 4 static int cnt = 0; 5 6 #define LL_MIN ((long long)(-__LONG_LONG_MAX__ - 1)) 7 8 #define SC1 (LL_MIN + 5) 9 #define UC1 ((1ULL << (__LONG_LONG_WIDTH__ - 1)) | 5ULL) 10 #define UC2 (~UC1) 11 12 long long __attribute__ ((noinline, noclone)) f1(long long a)13f1 (long long a) 14 { 15 long long x; 16 if (__builtin_add_overflow (a, SC1, &x)) cnt++; 17 return x; 18 } 19 20 unsigned long long __attribute__ ((noinline, noclone)) f2(unsigned long long a)21f2 (unsigned long long a) 22 { 23 unsigned long long x; 24 if (__builtin_add_overflow (a, UC1, &x)) 25 cnt++; 26 return x; 27 } 28 main()29int main () 30 { 31 if (f1 (-5) != LL_MIN) __builtin_abort (); 32 if (cnt != 0) __builtin_abort (); 33 f1 (-6); 34 if (cnt != 1) __builtin_abort (); 35 cnt = 0; 36 if (f2 (UC2) != ~0ULL) __builtin_abort (); 37 if (cnt != 0) __builtin_abort (); 38 if (f2 (UC2 + 1) != 0) __builtin_abort (); 39 if (cnt != 1) __builtin_abort (); 40 return 0; 41 } 42