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