Imported Upstream version 2.9.0
[debian/cc1111] / support / regression / tests / constantRange.c
1 /** constant range tests.
2
3 */
4
5 #include <testfwk.h>
6 #include <stdbool.h>
7 #ifdef __sun__
8 #include <inttypes.h>
9 #else
10 #include <stdint.h>
11 #endif
12
13 #if defined (__GNUC__) && defined (__alpha__) && (__GNUC__ < 3)
14 /* bool should be casted to int in order to pass the test. Is this a gcc bug? */
15 #define INT_CAST  (int)
16 #else
17 #define INT_CAST
18 #endif
19
20  int8_t s8;
21 uint8_t u8;
22
23  int16_t s16;
24 uint16_t u16;
25
26  int32_t s32;
27 uint32_t u32;
28
29 void
30 testConstantRange (void)
31 {
32   ASSERT (! (INT8_MIN - 1 == s8));
33   ASSERT (! (INT8_MAX + 1 == s8));
34   ASSERT (  (INT8_MIN - 1 != s8));
35   ASSERT (  (INT8_MAX + 1 != s8));
36   ASSERT (  (INT8_MIN - 1 <  s8));
37   ASSERT (! (INT8_MAX     <  s8));
38   ASSERT (  (INT8_MIN     <= s8));
39   ASSERT (! (INT8_MAX     <= s8));
40   ASSERT (! (INT8_MIN     >  s8));
41   ASSERT (  (INT8_MAX + 1 >  s8));
42   ASSERT (! (INT8_MIN - 1 >= s8));
43   ASSERT (  (INT8_MAX     >= s8));
44
45   ASSERT (! (        0 - 1 == u8));
46   ASSERT (! (UINT8_MAX + 1 == u8));
47   ASSERT (  (        0 - 1 != u8));
48   ASSERT (  (UINT8_MAX + 1 != u8));
49   ASSERT (  (        0 - 1 <  u8));
50   ASSERT (! (UINT8_MAX     <  u8));
51   ASSERT (  (        0     <= u8));
52   ASSERT (! (UINT8_MAX + 1 <= u8));
53   ASSERT (! (        0     >  u8));
54   ASSERT (  (UINT8_MAX + 1 >  u8));
55   ASSERT (! (        0 - 1 >= u8));
56   ASSERT (  (UINT8_MAX     >= u8));
57
58   /* force extension to long to avoid int (16 bit) overflow */
59   ASSERT (! (INT16_MIN - 1L == s16));
60   ASSERT (! (INT16_MAX + 1L == s16));
61   ASSERT (  (INT16_MIN - 1L != s16));
62   ASSERT (  (INT16_MAX + 1L != s16));
63   ASSERT (  (INT16_MIN - 1L <  s16));
64   ASSERT (! (INT16_MAX      <  s16));
65   ASSERT (  (INT16_MIN      <= s16));
66   ASSERT (! (INT16_MAX      <= s16));
67   ASSERT (! (INT16_MIN      >  s16));
68   ASSERT (  (INT16_MAX + 1L >  s16));
69   ASSERT (! (INT16_MIN - 1L >= s16));
70   ASSERT (  (INT16_MAX      >= s16));
71
72   ASSERT (! (         0 - 1  == u16));
73   ASSERT (! (UINT16_MAX + 1L == u16));
74   ASSERT (  (         0 - 1  != u16));
75   ASSERT (  (UINT16_MAX + 1L != u16));
76   ASSERT (! (UINT16_MAX      <  u16));
77   ASSERT (  (         0      <= u16));
78   ASSERT (! (UINT16_MAX + 1L <= u16));
79   ASSERT (! (         0      >  u16));
80   ASSERT (  (UINT16_MAX + 1L >  u16));
81   ASSERT (  (UINT16_MAX      >= u16));
82
83 #if defined(PORT_HOST)
84 /* on 32bit host: -1 is presented as 32 bit int, 16 bit unsigned short is promoted to 32 bit int */
85   ASSERT (  (         0 - 1  <  u16)); /* -1 > 0 */
86   ASSERT (! (         0 - 1  >= u16)); /* !(-1 <= 0) */
87 #else
88 /* on 16bit sdcc: int (-1) is promoted to unsigned int (0xffff) */
89   ASSERT (  (         0 - 1  >  u16)); /* 0xffff > 0 */
90   ASSERT (! (         0 - 1  <= u16)); /* !(0xffff <= 0) */
91 #endif
92
93    /* sdcc can't hold a number (INT32_MIN - 1) or (INT32_MAX + 1),
94       there's no 'double' or 'long long' */
95 /* ASSERT (! (INT32_MIN - 1 == s32)); */
96 /* ASSERT (! (INT32_MAX + 1 == s32)); */
97 /* ASSERT (  (INT32_MIN - 1 != s32)); */
98 /* ASSERT (  (INT32_MAX + 1 != s32)); */
99 /* ASSERT (  (INT32_MIN - 1 <  s32)); */
100    ASSERT (! (INT32_MAX     <  s32));
101    ASSERT (  (INT32_MIN     <= s32));
102    ASSERT (! (INT32_MAX     <= s32));
103    ASSERT (! (INT32_MIN     >  s32));
104 /* ASSERT (  (INT32_MAX + 1 >  s32)); */
105 /* ASSERT (! (INT32_MIN - 1 >= s32)); */
106    ASSERT (  (INT32_MAX     >= s32));
107
108    ASSERT (! (         0 - 1 == u32));
109 /* ASSERT (! (UINT32_MAX + 1 == u32)); */
110    ASSERT (  (         0 - 1 != u32));
111 /* ASSERT (  (UINT32_MAX + 1 != u32)); */
112    ASSERT (  (         0 - 1 >  u32)); /* 0xffffffff > 0 */
113    ASSERT (! (UINT32_MAX     <  u32));
114    ASSERT (  (         0     <= u32));
115 /* ASSERT (! (UINT32_MAX + 1 <= u32)); */
116    ASSERT (! (         0     >  u32));
117 /* ASSERT (  (UINT32_MAX + 1 >  u32)); */
118    ASSERT (! (         0 - 1 <= u32)); /* !(0xffffffff <= 0) */
119    ASSERT (  (UINT32_MAX     >= u32));
120 }
121
122 void
123 testFoo1(void)
124 {
125 #ifdef __bool_true_false_are_defined
126
127 #if defined(PORT_HOST)
128    volatile bool sb, ub;
129 #else
130    volatile   signed bool sb;
131    volatile unsigned bool ub;
132 #endif
133
134   sb = 0;
135   ub = 0;
136
137   ASSERT (! (-1 == sb));
138   ASSERT (  ( 0 == sb));
139   ASSERT (! ( 1 == sb));
140
141   ASSERT (  (-1 != sb));
142   ASSERT (! ( 0 != sb));
143   ASSERT (  ( 1 != sb));
144
145   ASSERT (  (-1 <  INT_CAST sb));
146   ASSERT (! ( 0 <  sb));
147
148   ASSERT (  ( 0 <= sb));
149   ASSERT (! ( 1 <= sb));
150
151   ASSERT (! ( 0 >  sb));
152   ASSERT (  ( 1 >  sb));
153
154   ASSERT (! (-1 >= INT_CAST sb));
155   ASSERT (  ( 0 >= sb));
156
157
158   ASSERT (! (-1 == ub));
159   ASSERT (  ( 0 == ub));
160   ASSERT (! ( 1 == ub));
161
162   ASSERT (  (-1 != ub));
163   ASSERT (! ( 0 != ub));
164   ASSERT (  ( 1 != ub));
165
166   ASSERT (  (-1 <  INT_CAST ub));
167   ASSERT (! ( 0 <  ub));
168
169   ASSERT (  ( 0 <= ub));
170   ASSERT (! ( 1 <= ub));
171
172   ASSERT (! ( 0 >  ub));
173   ASSERT (  ( 1 >  ub));
174
175   ASSERT (! (-1 >= INT_CAST ub));
176   ASSERT (  ( 0 >= ub));
177 #endif //__bool_true_false_are_defined
178 }
179
180 void
181 testFoo2(void)
182 {
183   volatile struct {
184       signed sb1:1;
185       signed sb3:3;
186     unsigned ub1:1;
187     unsigned ub3:3;
188   } str;
189
190   str.sb1 = 0;
191   str.ub1 = 0;
192   str.sb3 = 0;
193   str.ub3 = 0;
194
195   ASSERT (! (-2 == str.sb1));
196   ASSERT (! (-1 == str.sb1));
197   ASSERT (  ( 0 == str.sb1));
198   ASSERT (! ( 1 == str.sb1));
199
200   ASSERT (! (-1 == str.ub1));
201   ASSERT (  ( 0 == str.ub1));
202   ASSERT (! ( 1 == str.ub1));
203   ASSERT (! ( 2 == str.ub1));
204
205   ASSERT (! (-5 == str.sb3));
206   ASSERT (! (-4 == str.sb3));
207   ASSERT (  ( 0 == str.sb3));
208   ASSERT (! ( 3 == str.sb3));
209   ASSERT (! ( 4 == str.sb3));
210
211   ASSERT (! (-1 == str.ub3));
212   ASSERT (  ( 0 == str.ub3));
213   ASSERT (! ( 7 == str.ub3));
214   ASSERT (! ( 8 == str.ub3));
215 }