1 | //-*- C -*- |
2 | |
3 | /* This is a |
4 | multiline comment */ |
5 | |
6 | // Intended to exercise all syntactic parts of the C language. |
7 | |
8 | int g0; |
9 | int g1, g2; |
10 | |
11 | struct s0; |
12 | |
13 | struct s0 { |
14 | int x; |
15 | }; |
16 | |
17 | int g3 = 10; |
18 | |
19 | __asm(""); |
20 | |
21 | typedef int td0; |
22 | |
23 | td0 g4; |
24 | |
25 | enum e0 { |
26 | ec0 |
27 | }; |
28 | |
29 | static void f0(int x) { |
30 | } |
31 | |
32 | inline void f0_0(int x) { |
33 | ; |
34 | } |
35 | |
36 | extern void f0_1(int x) { |
37 | } |
38 | |
39 | void f1(int, ...); |
40 | |
41 | // Statements. |
42 | void f2() { |
43 | for (;;) { |
44 | break; |
45 | continue; |
46 | } |
47 | |
48 | while (0) { |
49 | } |
50 | |
51 | do { |
52 | } while (0); |
53 | |
54 | void *label = &&theif; |
55 | goto *label; |
56 | |
57 | goto theif; |
58 | theif: |
59 | if (0) { |
60 | ; |
61 | } else if (0) { |
62 | } else { |
63 | } |
64 | |
65 | switch(0) { |
66 | case 0: |
67 | case 1 ... 2: |
68 | break; |
69 | default: |
70 | break; |
71 | } |
72 | |
73 | asm ("nop"); |
74 | |
75 | return; |
76 | } |
77 | |
78 | // Expressions. |
79 | |
80 | #include <stdarg.h> |
81 | |
82 | typedef struct ipair { |
83 | int first, second; |
84 | } ipair; |
85 | |
86 | void f4(int a0, int a1, int a2, va_list ap) { |
87 | int t0 = a0 ? a1 : a2; |
88 | float t1 = (float) a0; |
89 | ipair t2 = {1, 2}; |
90 | ipair t2a = { .second = 2 }; |
91 | int t3 = sizeof(ipair); |
92 | ipair t4; |
93 | t4 = (ipair) {1, 2}; |
94 | extern int g(int); |
95 | int t5 = g(a0); |
96 | int t6 = t4.first; |
97 | int t7[10]; |
98 | int t8 = t7[a0]; |
99 | t8++; |
100 | const char *t9 = __FUNCTION__; |
101 | char t10 = 'x'; |
102 | int t11 = __builtin_offsetof(ipair, first); |
103 | int t12 = __builtin_types_compatible_p(ipair, int); |
104 | int t12_0 = __builtin_classify_type(t0); |
105 | int t12_1 = __builtin_classify_type(t1); |
106 | int t12_2 = __builtin_classify_type(t2); |
107 | // FIXME: Add _Complex and aggregate cases. |
108 | int t13 = va_arg(ap, int); |
109 | va_list t13_0; |
110 | va_copy(t13_0, ap); |
111 | int t14 = __extension__(t13); |
112 | int t15 = +t13; |
113 | unsigned t16 = t14 ^ t15; |
114 | int t17 = t14 % t15; |
115 | int t17_0 = t16 % t16; |
116 | float t18; |
117 | int t19 = t18 ? 0 : 1; |
118 | char *t20; ++t20; --t20; |
119 | float t21; ++t21; --t21; |
120 | double t22; ++t22; --t22; |
121 | long double t23; ++t23; --t23; |
122 | int t24 = !t19; |
123 | int t25 = __real t24; |
124 | int t26 = __imag t24; |
125 | const char *t27 = t9; |
126 | t27 += (unsigned char) 0xFF; |
127 | t27 += (signed char) 0xFF; |
128 | |
129 | struct { char f0[10]; } *t28; |
130 | int t29 = t28 - t28; |
131 | char *t30 = &t28->f0[1]; |
132 | |
133 | struct s1 { int f0; }; |
134 | struct s1 t31_a, t31_b; |
135 | int t31_cond; |
136 | int t31 = (t31_cond ? t31_a : t31_b).f0; |
137 | |
138 | _Complex float t32_a, t32_b; |
139 | int t32_cond; |
140 | int t32 = __real (t32_cond ? t32_a : t32_b); |
141 | |
142 | struct { int x, y; } t33, *t34, t35[12], t36(int, float); |
143 | float t37, *t38, t39[9], t40(double); |
144 | } |
145 | |
146 | // Extended vectors |
147 | |
148 | typedef __attribute__((ext_vector_type(2))) float float2; |
149 | typedef __attribute__((ext_vector_type(4))) float float4; |
150 | |
151 | void f5() { |
152 | float4 t0 = (float4) { 0, 1, 2, 3 }; |
153 | float4 t1 = t0; |
154 | t0.lo.even = t1.hi.x; |
155 | |
156 | // irgen doesn't support this yet. |
157 | #if 0 |
158 | int t2_cond; |
159 | float2 t2 = (t2_cond ? t0 : t1).lo; |
160 | #endif |
161 | } |
162 | |
163 | void f6() { |
164 | const char *s0 = __func__; |
165 | const char *s1 = __FUNCTION__; |
166 | const char *s2 = __PRETTY_FUNCTION__; |
167 | } |
168 | |
169 | // Arg mismatch with passed type. |
170 | void f7(x) |
171 | float x; |
172 | { |
173 | } |
174 | |
175 | void f8(x) |
176 | short x; |
177 | { |
178 | } |
179 | |
180 | // Function which inputs an array |
181 | void f9(int x[]) { } |
182 | |
183 | // Object literals. |
184 | void f10() { |
185 | struct f10_s0 { |
186 | char iv0[10]; |
187 | } x; |
188 | |
189 | x = (struct f10_s0) { .iv0 = "name" }; |
190 | } |
191 | |
192 | // Nested structures. |
193 | struct s11 { |
194 | struct s11_2 { |
195 | int f0; |
196 | } f0; |
197 | int f1; |
198 | }; |
199 | |
200 | // Unnamed structures. |
201 | struct s12 { |
202 | struct { |
203 | unsigned char aa; |
204 | unsigned char bb; |
205 | }; |
206 | }; |
207 | |
208 | void f11() { |
209 | struct s12 var = { .aa = 33 }; |
210 | } |
211 | |