1  /* PR middle-end/87248 */
       2  /* { dg-do run } */
       3  
       4  void
       5  foo (signed char *p, int q)
       6  {
       7    *p = q & (-__SCHAR_MAX__ - 1) ? (-__SCHAR_MAX__ - 1) : 0;
       8  }
       9  
      10  int
      11  bar (long long x)
      12  {
      13    return x & (-__INT_MAX__ - 1) ? (-__INT_MAX__ - 1) : 0;
      14  }
      15  
      16  int
      17  main ()
      18  {
      19  #if __INT_MAX__ > 4 * __SCHAR_MAX__
      20    signed char a[4];
      21    foo (a, __SCHAR_MAX__ + 1U);
      22    foo (a + 1, 2 * (__SCHAR_MAX__ + 1U));
      23    foo (a + 2, -__INT_MAX__ - 1);
      24    foo (a + 3, (__SCHAR_MAX__ + 1U) / 2);
      25    if (a[0] != (-__SCHAR_MAX__ - 1) || a[1] != a[0] || a[2] != a[0] || a[3] != 0)
      26      __builtin_abort ();
      27  #endif
      28  #if __LONG_LONG_MAX__ > 4 * __INT_MAX__
      29    if (bar (__INT_MAX__ + 1LL) != (-__INT_MAX__ - 1)
      30        || bar (2 * (__INT_MAX__ + 1LL)) != (-__INT_MAX__ - 1)
      31        || bar (-__LONG_LONG_MAX__ - 1) != (-__INT_MAX__ - 1)
      32        || bar ((__INT_MAX__ + 1LL) / 2) != 0)
      33      __builtin_abort ();
      34  #endif
      35    return 0;
      36  }