c40e43eb6e1bffbb31601f00f3dfeff6d5881137
[fw/sdcc] / support / regression / tests / bitvars.c
1 /** Bit vars test.
2
3     type: bool, char, unsigned char, unsigned short, unsigned long
4 */
5
6 #include <testfwk.h>
7 #include <stdbool.h>
8
9 #ifndef PORT_HOST
10 #pragma disable_warning 180 //no warning about using complement on bit/unsigned char
11 #endif
12
13 #if defined (SDCC_hc08) || defined (SDCC_z80) || defined (SDCC_gbz80) || defined (SDCC_pic14) || defined (SDCC_pic16)
14 /* sdcc tagrets not supporting bit type */
15 #define NO_BITS
16 #endif
17
18 #if defined (__GNUC__) && defined (__alpha__) && (__GNUC__ < 3)
19 /* since this fails on GCC 2.95.4 on alpha... */
20 #define NO_BITS
21 #endif
22
23 #ifndef NO_BITS
24
25 #define TYPE_{type}
26
27 char foo(bool a, bool b, char c)
28 {
29   return a + b + c;
30 }
31
32 char complement(bool a, bool b)
33 {
34   return (a == b);
35 }
36
37 {type} _0 = 0, _1 = 1, _ff = 0xFF, _ffff = -1;
38
39 #endif
40
41 void
42 testBits(void)
43 {
44 #ifndef NO_BITS
45   bool x = 2;
46   ASSERT (foo(x,3,4) == 6);
47
48   ASSERT (complement (~_0, 1));
49   ASSERT (complement (~_1, 1));
50
51 #if defined TYPE_char
52   ASSERT (complement (~_ff, 0));
53 #else
54   ASSERT (complement (~_ff, 1));
55 #endif
56
57 #if defined TYPE_bool
58   ASSERT (complement (~_ffff, 1));
59 #elif defined TYPE_char
60   ASSERT (complement (~_ffff, 0));
61 #else
62   if (sizeof({type}) < sizeof(int))
63     ASSERT (complement (~_ffff, 1));
64   else
65     ASSERT (complement (~_ffff, 0));
66 #endif
67
68 #endif
69 }