1 extern void *malloc(unsigned long); 2 3 static inline __attribute__((__const__)) unsigned squarec(unsigned n) 4 { 5 return n*n; 6 } 7 8 static inline unsigned square(unsigned n) 9 { 10 return n*n; 11 } 12 13 static inline unsigned long long bignum(void) 14 { 15 return 1000000000000ULL; 16 } 17 18 static inline __attribute__((__const__)) unsigned long long bignumc(void) 19 { 20 return 1000000000000ULL; 21 } 22 23 // test if x is an integer constant expression [C99,C11 6.6p6] 24 #define ICE_P(x) \ 25 (__builtin_types_compatible_p(typeof(0?((void*)((long)(x)*0l)):(int*)1),int*)) 26 27 #define CHX_P(X) __builtin_choose_expr(ICE_P(X), 1, 0) 28 #define CST_P(X) __builtin_constant_p(ICE_P(X)) 29 30 #define TEST(R, X) _Static_assert(ICE_P(X) == R, "ICE_P(" #X ") => " #R); \ 31 _Static_assert(ICE_P(ICE_P(X)), "ICE_P2(" #X ")"); \ 32 _Static_assert(CHX_P(X) == R, "CHX_P(" #X ") => " #R); \ 33 _Static_assert(CST_P(X) == 1, "CST_P(" #X ")") 34 35 int main(int argc, char *argv[]) 36 { 37 char fla[3]; 38 char vla[argc++]; 39 char **p, **q; 40 int x = 5, y = 8; 41 void *v; 42 43 p = &argv[3]; 44 q = &argv[6]; 45 46 TEST(1, 4); 47 TEST(1, sizeof(long)); 48 TEST(1, 5ull - 3u); 49 TEST(1, 3.2); 50 TEST(1, sizeof(fla)); 51 52 TEST(0, square(2)); 53 TEST(0, square(argc)); 54 TEST(0, squarec(2)); 55 TEST(0, squarec(argc)); 56 TEST(0, 1+argc-argc); 57 TEST(0, 1+argc+argc+1-argc-argc); 58 TEST(0, bignum() - 1); 59 TEST(0, 0*bignum()); 60 TEST(0, 0*bignumc()); 61 TEST(0, sizeof(vla)); 62 TEST(0, p); 63 TEST(0, p < q); 64 TEST(0, p++); 65 TEST(0, main); 66 TEST(0, malloc(8)); 67 TEST(0, v = malloc(8)); 68 TEST(0, v); 69 TEST(0, x++); 70 TEST(0, y++); 71 TEST(0, (3, 2, 1)); 72 TEST(0, ({x++; 0; })); 73 TEST(0, ({square(y--); 0; })); 74 TEST(0, (square(x), 3)); 75 TEST(0, (squarec(x), 3)); 76 TEST(0, ({squarec(x); 3;})); 77 TEST(0, ({squarec(x);})); 78 79 return 0; 80 } 81 82 /* 83 * check-name: integer-const-expr 84 * check-command: sparse -Wno-vla $file 85 */ 86