OSDN Git Service

* c-common.c (c_common_reswords): Add _Static_assert for C.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / binary-constants-1.c
1 /* Test for binary integer constants.  */
2
3 /* Derived from: c99-intconst-1.c, bye Joseph Myers <jsm28@cam.ac.uk>.  */
4 /* Origin: Joerg Wunsch <j.gnu@uriah.heep.sax.de>.  */
5 /* { dg-do compile } */
6 /* { dg-options "-std=gnu99" } */
7
8 #include <limits.h>
9
10 /* Assertion that constant C is of type T.  */
11 #define ASSERT_CONST_TYPE(C, T)                 \
12         do {                                    \
13           typedef T type;                       \
14           typedef type **typepp;                \
15           typedef __typeof__((C)) ctype;        \
16           typedef ctype **ctypepp;              \
17           typepp x = 0;                         \
18           ctypepp y = 0;                        \
19           x = y;                                \
20           y = x;                                \
21         } while (0)
22
23 /* (T *) if E is zero, (void *) otherwise.  */
24 #define type_if_not(T, E) __typeof__(0 ? (T *)0 : (void *)(E))
25
26 /* (T *) if E is nonzero, (void *) otherwise.  */
27 #define type_if(T, E) type_if_not(T, !(E))
28
29 /* Combine pointer types, all but one (void *).  */
30 #define type_comb2(T1, T2) __typeof__(0 ? (T1)0 : (T2)0)
31 #define type_comb3(T1, T2, T3) type_comb2(T1, type_comb2(T2, T3))
32 #define type_comb4(T1, T2, T3, T4)                              \
33         type_comb2(T1, type_comb2(T2, type_comb2(T3, T4)))
34 #define type_comb6(T1, T2, T3, T4, T5, T6)                                 \
35         type_comb2(T1,                                                     \
36                    type_comb2(T2,                                          \
37                               type_comb2(T3,                               \
38                                          type_comb2(T4,                    \
39                                                     type_comb2(T5, T6)))))
40
41 /* (T1 *) if E1, otherwise (T2 *) if E2.  */
42 #define first_of2p(T1, E1, T2, E2) type_comb2(type_if(T1, (E1)),           \
43                                              type_if(T2, (!(E1) && (E2))))
44 /* (T1 *) if E1, otherwise (T2 *) if E2, otherwise (T3 *) if E3.  */
45 #define first_of3p(T1, E1, T2, E2, T3, E3)                      \
46         type_comb3(type_if(T1, (E1)),                           \
47                    type_if(T2, (!(E1) && (E2))),                \
48                    type_if(T3, (!(E1) && !(E2) && (E3))))
49 /* (T1 *) if E1, otherwise (T2 *) if E2, otherwise (T3 *) if E3, otherwise
50    (T4 *) if E4.  */
51 #define first_of4p(T1, E1, T2, E2, T3, E3, T4, E4)                      \
52         type_comb4(type_if(T1, (E1)),                                   \
53                    type_if(T2, (!(E1) && (E2))),                        \
54                    type_if(T3, (!(E1) && !(E2) && (E3))),               \
55                    type_if(T4, (!(E1) && !(E2) && !(E3) && (E4))))
56 /* (T1 *) if E1, otherwise (T2 *) if E2, otherwise (T3 *) if E3, otherwise
57    (T4 *) if E4, otherwise (T5 *) if E5, otherwise (T6 *) if E6.  */
58 #define first_of6p(T1, E1, T2, E2, T3, E3, T4, E4, T5, E5, T6, E6)          \
59         type_comb6(type_if(T1, (E1)),                                       \
60                    type_if(T2, (!(E1) && (E2))),                            \
61                    type_if(T3, (!(E1) && !(E2) && (E3))),                   \
62                    type_if(T4, (!(E1) && !(E2) && !(E3) && (E4))),          \
63                    type_if(T5, (!(E1) && !(E2) && !(E3) && !(E4) && (E5))), \
64                    type_if(T6, (!(E1) && !(E2) && !(E3)                     \
65                                 && !(E4) && !(E5) && (E6))))
66
67 /* Likewise, but return the original type rather than a pointer type.  */
68 #define first_of2(T1, E1, T2, E2)                       \
69         __typeof__(*((first_of2p(T1, (E1), T2, (E2)))0))
70 #define first_of3(T1, E1, T2, E2, T3, E3)                               \
71         __typeof__(*((first_of3p(T1, (E1), T2, (E2), T3, (E3)))0))
72 #define first_of4(T1, E1, T2, E2, T3, E3, T4, E4)                           \
73         __typeof__(*((first_of4p(T1, (E1), T2, (E2), T3, (E3), T4, (E4)))0))
74 #define first_of6(T1, E1, T2, E2, T3, E3, T4, E4, T5, E5, T6, E6)       \
75         __typeof__(*((first_of6p(T1, (E1), T2, (E2), T3, (E3),          \
76                                  T4, (E4), T5, (E5), T6, (E6)))0))
77
78 /* Types of constants according to the C99 rules.  */
79 #define C99_UNSUF_TYPE(C)                                       \
80         first_of6(int, (C) <= INT_MAX,                          \
81                   unsigned int, (C) <= UINT_MAX,                \
82                   long int, (C) <= LONG_MAX,                    \
83                   unsigned long int, (C) <= ULONG_MAX,          \
84                   long long int, (C) <= LLONG_MAX,              \
85                   unsigned long long int, (C) <= ULLONG_MAX)
86 #define C99_SUFu_TYPE(C)                                        \
87         first_of3(unsigned int, (C) <= UINT_MAX,                \
88                   unsigned long int, (C) <= ULONG_MAX,          \
89                   unsigned long long int, (C) <= ULLONG_MAX)
90 #define C99_SUFl_TYPE(C)                                        \
91         first_of4(long int, (C) <= LONG_MAX,                    \
92                   unsigned long int, (C) <= ULONG_MAX,          \
93                   long long int, (C) <= LLONG_MAX,              \
94                   unsigned long long int, (C) <= ULLONG_MAX)
95 #define C99_SUFul_TYPE(C)                                       \
96         first_of2(unsigned long int, (C) <= ULONG_MAX,          \
97                   unsigned long long int, (C) <= ULLONG_MAX)
98 #define C99_SUFll_TYPE(C)                                       \
99         first_of2(long long int, (C) <= LLONG_MAX,              \
100                   unsigned long long int, (C) <= ULLONG_MAX)
101
102 /* Checks that constants have correct type.  */
103 #define CHECK_UNSUF_TYPE(C)                             \
104         ASSERT_CONST_TYPE((C), C99_UNSUF_TYPE((C)))
105 #define CHECK_SUFu_TYPE(C) ASSERT_CONST_TYPE((C), C99_SUFu_TYPE((C)))
106 #define CHECK_SUFl_TYPE(C)                              \
107         ASSERT_CONST_TYPE((C), C99_SUFl_TYPE((C)))
108 #define CHECK_SUFul_TYPE(C) ASSERT_CONST_TYPE((C), C99_SUFul_TYPE((C)))
109 #define CHECK_SUFll_TYPE(C)                             \
110         ASSERT_CONST_TYPE((C), C99_SUFll_TYPE((C)))
111 #define CHECK_SUFull_TYPE(C) ASSERT_CONST_TYPE((C), unsigned long long int)
112
113 /* Check an octal or hexadecimal value, with all suffixes.  */
114 #define CHECK_CONST(C)                          \
115         CHECK_UNSUF_TYPE(C);                    \
116         CHECK_SUFu_TYPE(C##u);                  \
117         CHECK_SUFu_TYPE(C##U);                  \
118         CHECK_SUFl_TYPE(C##l);                  \
119         CHECK_SUFl_TYPE(C##L);                  \
120         CHECK_SUFul_TYPE(C##ul);                \
121         CHECK_SUFul_TYPE(C##uL);                \
122         CHECK_SUFul_TYPE(C##Ul);                \
123         CHECK_SUFul_TYPE(C##UL);                \
124         CHECK_SUFll_TYPE(C##ll);                \
125         CHECK_SUFll_TYPE(C##LL);                \
126         CHECK_SUFull_TYPE(C##ull);              \
127         CHECK_SUFull_TYPE(C##uLL);              \
128         CHECK_SUFull_TYPE(C##Ull);              \
129         CHECK_SUFull_TYPE(C##ULL);
130
131 #define CHECK_BIN_CONST(C)                      \
132         CHECK_CONST(0b##C);                     \
133         CHECK_CONST(0B##C);
134
135 /* True iff "long long" is at least B bits.  This presumes that (B-2)/3 is at
136    most 63.  */
137 #define LLONG_AT_LEAST(B)                       \
138         (LLONG_MAX >> ((B)-2)/3 >> ((B)-2)/3    \
139          >> ((B)-2 - ((B)-2)/3 - ((B)-2)/3))
140
141 #define LLONG_HAS_BITS(B) (LLONG_AT_LEAST((B)) && !LLONG_AT_LEAST((B) + 1))
142
143 #define FOO 0b1101
144 #if !FOO
145 # error "preprocessor does not accept binary constants"
146 #endif
147
148 void
149 foo (void)
150 {
151   /* Check all 2^n and 2^n - 1 up to 2^72 - 1.  */
152   CHECK_BIN_CONST(1);
153   CHECK_BIN_CONST(10);
154   CHECK_BIN_CONST(11);
155   CHECK_BIN_CONST(100);
156   CHECK_BIN_CONST(111);
157   CHECK_BIN_CONST(1000);
158   CHECK_BIN_CONST(1111);
159   CHECK_BIN_CONST(10000);
160   CHECK_BIN_CONST(11111);
161   CHECK_BIN_CONST(100000);
162   CHECK_BIN_CONST(111111);
163   CHECK_BIN_CONST(1000000);
164   CHECK_BIN_CONST(1111111);
165   CHECK_BIN_CONST(10000000);
166   CHECK_BIN_CONST(11111111);
167   CHECK_BIN_CONST(100000000);
168   CHECK_BIN_CONST(111111111);
169   CHECK_BIN_CONST(1000000000);
170   CHECK_BIN_CONST(1111111111);
171   CHECK_BIN_CONST(10000000000);
172   CHECK_BIN_CONST(11111111111);
173   CHECK_BIN_CONST(100000000000);
174   CHECK_BIN_CONST(111111111111);
175   CHECK_BIN_CONST(1000000000000);
176   CHECK_BIN_CONST(1111111111111);
177   CHECK_BIN_CONST(10000000000000);
178   CHECK_BIN_CONST(11111111111111);
179   CHECK_BIN_CONST(100000000000000);
180   CHECK_BIN_CONST(111111111111111);
181   CHECK_BIN_CONST(1000000000000000);
182   CHECK_BIN_CONST(1111111111111111);
183   CHECK_BIN_CONST(10000000000000000);
184   CHECK_BIN_CONST(11111111111111111);
185   CHECK_BIN_CONST(100000000000000000);
186   CHECK_BIN_CONST(111111111111111111);
187   CHECK_BIN_CONST(1000000000000000000);
188   CHECK_BIN_CONST(1111111111111111111);
189   CHECK_BIN_CONST(10000000000000000000);
190   CHECK_BIN_CONST(11111111111111111111);
191   CHECK_BIN_CONST(100000000000000000000);
192   CHECK_BIN_CONST(111111111111111111111);
193   CHECK_BIN_CONST(1000000000000000000000);
194   CHECK_BIN_CONST(1111111111111111111111);
195   CHECK_BIN_CONST(10000000000000000000000);
196   CHECK_BIN_CONST(11111111111111111111111);
197   CHECK_BIN_CONST(100000000000000000000000);
198   CHECK_BIN_CONST(111111111111111111111111);
199   CHECK_BIN_CONST(1000000000000000000000000);
200   CHECK_BIN_CONST(1111111111111111111111111);
201   CHECK_BIN_CONST(10000000000000000000000000);
202   CHECK_BIN_CONST(11111111111111111111111111);
203   CHECK_BIN_CONST(100000000000000000000000000);
204   CHECK_BIN_CONST(111111111111111111111111111);
205   CHECK_BIN_CONST(1000000000000000000000000000);
206   CHECK_BIN_CONST(1111111111111111111111111111);
207   CHECK_BIN_CONST(10000000000000000000000000000);
208   CHECK_BIN_CONST(11111111111111111111111111111);
209   CHECK_BIN_CONST(100000000000000000000000000000);
210   CHECK_BIN_CONST(111111111111111111111111111111);
211   CHECK_BIN_CONST(1000000000000000000000000000000);
212   CHECK_BIN_CONST(1111111111111111111111111111111);
213   CHECK_BIN_CONST(10000000000000000000000000000000);
214   CHECK_BIN_CONST(11111111111111111111111111111111);
215   CHECK_BIN_CONST(100000000000000000000000000000000);
216   CHECK_BIN_CONST(111111111111111111111111111111111);
217   CHECK_BIN_CONST(1000000000000000000000000000000000);
218   CHECK_BIN_CONST(1111111111111111111111111111111111);
219   CHECK_BIN_CONST(10000000000000000000000000000000000);
220   CHECK_BIN_CONST(11111111111111111111111111111111111);
221   CHECK_BIN_CONST(100000000000000000000000000000000000);
222   CHECK_BIN_CONST(111111111111111111111111111111111111);
223   CHECK_BIN_CONST(1000000000000000000000000000000000000);
224   CHECK_BIN_CONST(1111111111111111111111111111111111111);
225   CHECK_BIN_CONST(10000000000000000000000000000000000000);
226   CHECK_BIN_CONST(11111111111111111111111111111111111111);
227   CHECK_BIN_CONST(100000000000000000000000000000000000000);
228   CHECK_BIN_CONST(111111111111111111111111111111111111111);
229   CHECK_BIN_CONST(1000000000000000000000000000000000000000);
230   CHECK_BIN_CONST(1111111111111111111111111111111111111111);
231   CHECK_BIN_CONST(10000000000000000000000000000000000000000);
232   CHECK_BIN_CONST(11111111111111111111111111111111111111111);
233   CHECK_BIN_CONST(100000000000000000000000000000000000000000);
234   CHECK_BIN_CONST(111111111111111111111111111111111111111111);
235   CHECK_BIN_CONST(1000000000000000000000000000000000000000000);
236   CHECK_BIN_CONST(1111111111111111111111111111111111111111111);
237   CHECK_BIN_CONST(10000000000000000000000000000000000000000000);
238   CHECK_BIN_CONST(11111111111111111111111111111111111111111111);
239   CHECK_BIN_CONST(100000000000000000000000000000000000000000000);
240   CHECK_BIN_CONST(111111111111111111111111111111111111111111111);
241   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000);
242   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111);
243   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000);
244   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111);
245   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000);
246   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111);
247   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000);
248   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111);
249   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000);
250   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111);
251   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000);
252   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111);
253   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000);
254   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111);
255   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000);
256   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111);
257   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000);
258   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111);
259   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000);
260   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111);
261   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000);
262   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111);
263   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000);
264   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111);
265   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000);
266   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111);
267   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000);
268   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111);
269   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000);
270   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111);
271   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000000);
272   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111111);
273   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000000);
274   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111111);
275   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000000);
276   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111111);
277   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000000000);
278   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111111111);
279 #if LLONG_AT_LEAST(65)
280   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000000000);
281   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111111111);
282 #endif
283 #if LLONG_AT_LEAST(66)
284   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000000000);
285   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111111111);
286 #endif
287 #if LLONG_AT_LEAST(67)
288   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000000000000);
289   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111111111111);
290 #endif
291 #if LLONG_AT_LEAST(68)
292   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000000000000);
293   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111111111111);
294 #endif
295 #if LLONG_AT_LEAST(69)
296   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000000000000);
297   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111111111111);
298 #endif
299 #if LLONG_AT_LEAST(70)
300   CHECK_BIN_CONST(1000000000000000000000000000000000000000000000000000000000000000000000);
301   CHECK_BIN_CONST(1111111111111111111111111111111111111111111111111111111111111111111111);
302 #endif
303 #if LLONG_AT_LEAST(71)
304   CHECK_BIN_CONST(10000000000000000000000000000000000000000000000000000000000000000000000);
305   CHECK_BIN_CONST(11111111111111111111111111111111111111111111111111111111111111111111111);
306 #endif
307 #if LLONG_AT_LEAST(72)
308   CHECK_BIN_CONST(100000000000000000000000000000000000000000000000000000000000000000000000);
309   CHECK_BIN_CONST(111111111111111111111111111111111111111111111111111111111111111111111111);
310 #endif
311 }
312