1 /*
2    pr45034.c from the execute part of the gcc torture tests.
3  */
4 
5 #include <testfwk.h>
6 
7 #ifdef __SDCC
8 #pragma std_c99
9 #pragma disable_warning 85
10 #endif
11 
fixnum_neg(signed char x,signed char * py,int * pv)12 static void fixnum_neg(signed char x, signed char *py, int *pv)
13 {
14   unsigned char ux, uy;
15 
16   ux = (unsigned char)x;
17   uy = -ux;
18   *py = (uy <= 127) ? (signed char)uy : (-(signed char)(255 - uy) - 1);
19   *pv = (x == -128) ? 1 : 0;
20 }
21 
foo(int x,int y,int v)22 void foo(int x, int y, int v)
23 {
24   if (y < -128 || y > 127)
25     ASSERT(0);
26 }
27 
ftest_neg(void)28 int ftest_neg(void)
29 {
30   signed char x, y;
31   int v, err;
32 
33   err = 0;
34   x = -128;
35   for (;;) {
36       fixnum_neg(x, &y, &v);
37       foo((int)x, (int)y, v);
38       if ((v && x != -128) || (!v && x == -128))
39 	++err;
40       if (x == 127)
41 	break;
42       ++x;
43   }
44   return err;
45 }
46 
47 void
testTortureExecute(void)48 testTortureExecute (void)
49 {
50 #if !(defined (__GNUC__) && defined (__GNUC_MINOR__) && (__GNUC__ < 5 && __GNUC_MINOR__ < 6))
51   if (sizeof (char) != 1)
52     return;
53   if (ftest_neg() != 0)
54     ASSERT(0);
55   return;
56 #endif
57 }
58 
59