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 148void 149foo (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 313