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