1extern void abort (void); 2static void fixnum_neg(signed char x, signed char *py, int *pv) 3{ 4 unsigned char ux, uy; 5 6 ux = (unsigned char)x; 7 uy = -ux; 8 *py = (uy <= 127) ? (signed char)uy : (-(signed char)(255 - uy) - 1); 9 *pv = (x == -128) ? 1 : 0; 10} 11 12void __attribute__((noinline)) foo(int x, int y, int v) 13{ 14 if (y < -128 || y > 127) 15 abort(); 16} 17 18int test_neg(void) 19{ 20 signed char x, y; 21 int v, err; 22 23 err = 0; 24 x = -128; 25 for (;;) { 26 fixnum_neg(x, &y, &v); 27 foo((int)x, (int)y, v); 28 if ((v && x != -128) || (!v && x == -128)) 29 ++err; 30 if (x == 127) 31 break; 32 ++x; 33 } 34 return err; 35} 36 37int main(void) 38{ 39 if (sizeof (char) != 1) 40 return 0; 41 if (test_neg() != 0) 42 abort(); 43 return 0; 44} 45 46