struct / union in initializer, RFE #901.
[sdcc.git] / sdcc / support / regression / tests / gcc-torture-execute-pr31169.c
blobe7e199d646c04a29668a3db23b32e43dbf03585f
1 /*
2 pr31169.c from the execute part of the gcc torture tests.
3 */
5 #include <testfwk.h>
7 #ifdef __SDCC
8 #pragma std_c99
9 #endif
11 #define HOST_WIDE_INT long
12 #define HOST_BITS_PER_WIDE_INT (sizeof(long)*8)
14 #ifndef __SDCC_pic16 // TODO: enable when the pic16 ports supports bitfields of size greater than 8 bits!
15 struct tree_type
17 unsigned int precision : 9;
20 int
21 sign_bit_p (struct tree_type *t, HOST_WIDE_INT val_hi, unsigned HOST_WIDE_INT val_lo)
23 unsigned HOST_WIDE_INT mask_lo, lo;
24 HOST_WIDE_INT mask_hi, hi;
25 int width = t->precision;
27 if (width > HOST_BITS_PER_WIDE_INT)
29 hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1);
30 lo = 0;
32 mask_hi = ((unsigned HOST_WIDE_INT) -1
33 >> (2 * HOST_BITS_PER_WIDE_INT - width));
34 mask_lo = -1;
36 else
38 hi = 0;
39 lo = (unsigned HOST_WIDE_INT) 1 << (width - 1);
41 mask_hi = 0;
42 mask_lo = ((unsigned HOST_WIDE_INT) -1
43 >> (HOST_BITS_PER_WIDE_INT - width));
46 if ((val_hi & mask_hi) == hi
47 && (val_lo & mask_lo) == lo)
48 return 1;
50 return 0;
52 #endif
54 void
55 testTortureExecute (void)
57 #ifndef __SDCC_pic16 // TODO: enable when the pic16 ports supports bitfields of size greater than 8 bits!
58 struct tree_type t;
59 t.precision = 1;
60 if (!sign_bit_p (&t, 0, -1))
61 ASSERT (0);
62 return;
63 #endif