extern void *malloc(unsigned long); static inline __attribute__((__const__)) unsigned squarec(unsigned n) { return n*n; } static inline unsigned square(unsigned n) { return n*n; } static inline unsigned long long bignum(void) { return 1000000000000ULL; } static inline __attribute__((__const__)) unsigned long long bignumc(void) { return 1000000000000ULL; } // test if x is an integer constant expression [C99,C11 6.6p6] #define ICE_P(x) \ (__builtin_types_compatible_p(typeof(0?((void*)((long)(x)*0l)):(int*)1),int*)) #define CHX_P(X) __builtin_choose_expr(ICE_P(X), 1, 0) #define CST_P(X) __builtin_constant_p(ICE_P(X)) #define TEST(R, X) _Static_assert(ICE_P(X) == R, "ICE_P(" #X ") => " #R); \ _Static_assert(ICE_P(ICE_P(X)), "ICE_P2(" #X ")"); \ _Static_assert(CHX_P(X) == R, "CHX_P(" #X ") => " #R); \ _Static_assert(CST_P(X) == 1, "CST_P(" #X ")") int main(int argc, char *argv[]) { char fla[3]; char vla[argc++]; char **p, **q; int x = 5, y = 8; void *v; p = &argv[3]; q = &argv[6]; TEST(1, 4); TEST(1, sizeof(long)); TEST(1, 5ull - 3u); TEST(1, 3.2); TEST(1, sizeof(fla)); TEST(0, square(2)); TEST(0, square(argc)); TEST(0, squarec(2)); TEST(0, squarec(argc)); TEST(0, 1+argc-argc); TEST(0, 1+argc+argc+1-argc-argc); TEST(0, bignum() - 1); TEST(0, 0*bignum()); TEST(0, 0*bignumc()); TEST(0, sizeof(vla)); TEST(0, p); TEST(0, p < q); TEST(0, p++); TEST(0, main); TEST(0, malloc(8)); TEST(0, v = malloc(8)); TEST(0, v); TEST(0, x++); TEST(0, y++); TEST(0, (3, 2, 1)); TEST(0, ({x++; 0; })); TEST(0, ({square(y--); 0; })); TEST(0, (square(x), 3)); TEST(0, (squarec(x), 3)); TEST(0, ({squarec(x); 3;})); TEST(0, ({squarec(x);})); return 0; } /* * check-name: integer-const-expr * check-command: sparse -Wno-vla $file */