/* PR middle-end/38364 */ /* { dg-do run } */ /* { dg-options "-O2 -ftrapv" } */ /* { dg-require-effective-target trapping } */ extern void abort (void); static inline short f1 (short x, short y) { if (x > 0) { if (y > 0) { if (x > __SHRT_MAX__ / y) return x; } else if (y < (-__SHRT_MAX__ - 1) / x) return x; } else { if (y > 0) { if (x < (-__SHRT_MAX__ - 1) / y) return x; } else if (x != 0 && y < __SHRT_MAX__ / x) return x; } return x * y; } static inline signed char f2 (signed char x, signed char y) { if (((x ^ y) & (((x ^ ((x ^ y) & (1 << (__CHAR_BIT__ - 1)))) - y) ^ y)) < 0) return x; return x - y; } unsigned int v; int f3 (int x, unsigned int y) { f1 (1, 1); return 1; } int f4 (unsigned short x) { v = x; return 1; } int f5 (int x) { if (f2 (x, 1)) f1 (1, f4 (1)); return x; } int f6 (unsigned int x) { f4 (x < (1 != f5 (0))); return x; } int main (void) { f6 (1); if (v != 0) abort (); return 0; }