1extern void *malloc(unsigned long);
2
3static inline __attribute__((__const__)) unsigned squarec(unsigned n)
4{
5        return n*n;
6}
7
8static inline unsigned square(unsigned n)
9{
10        return n*n;
11}
12
13static inline unsigned long long bignum(void)
14{
15        return 1000000000000ULL;
16}
17
18static 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
35int 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