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