/* { dg-do run } */ typedef unsigned int u32; #if __SIZEOF_INT128__ typedef unsigned long long u64; typedef unsigned __int128 u128; #else typedef unsigned long u64; typedef unsigned long long u128; #endif u128 g; static __attribute__ ((noinline, noclone)) void check (u64 a, u64 b) { if (a != 0 || b != 4) __builtin_abort (); } int main (void) { u64 d = (g ? 5 : 4); u32 f = __builtin_sub_overflow_p (d, (u128) d, (u64) 0); u128 x = g + f + d; check ((x >> 1) >> (sizeof (u64) * __CHAR_BIT__ - 1), x); return 0; }