1
+ #include <stdbool.h>
2
+ #include <stdio.h>
3
+ // Note: Clang aims to support both clang and gcc extensions.
4
+ // This test case has been designed using lists compiled from:
5
+ // - https://clang.llvm.org/docs/LanguageExtensions.html
6
+ // - https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
7
+
8
+ #ifdef __has_builtin // NON_COMPLIANT
9
+ #endif
10
+ #ifdef __has_constexpr_builtin // NON_COMPLIANT
11
+ #endif
12
+ #ifdef __has_feature // NON_COMPLIANT
13
+ #endif
14
+ #ifdef __has_extension // NON_COMPLIANT
15
+ #endif
16
+ #ifdef __has_c_attribute // NON_COMPLIANT
17
+ #endif
18
+ #ifdef __has_attribute // NON_COMPLIANT
19
+ #endif
20
+ #ifdef __has_declspec_attribute // NON_COMPLIANT
21
+ #endif
22
+ #ifdef __is_identifier // NON_COMPLIANT
23
+ #endif
24
+ #ifdef __has_include // NON_COMPLIANT
25
+ #endif
26
+ #ifdef __has_include_next // NON_COMPLIANT
27
+ #endif
28
+ #ifdef __has_warning // NON_COMPLIANT
29
+ #endif
30
+
31
+ #define A __BASE_FILE__ // NON_COMPLIANT
32
+ #define B __FILE_NAME__ // NON_COMPLIANT
33
+ #define C __COUNTER__ // NON_COMPLIANT
34
+ #define D __INCLUDE_LEVEL__ // NON_COMPLIANT
35
+ #define E__TIMESTAMP__ // NON_COMPLIANT
36
+ #define F __clang__ // NON_COMPLIANT
37
+ #define G __clang_major__ // NON_COMPLIANT
38
+ #define H __clang_minor__ // NON_COMPLIANT
39
+ #define I __clang_patchlevel__ // NON_COMPLIANT
40
+ #define J __clang_version__ // NON_COMPLIANT
41
+ #define K __clang_literal_encoding__ // NON_COMPLIANT
42
+ #define L __clang_wide_literal_encoding__ // NON_COMPLIANT
43
+
44
+ typedef float float4 __attribute__((ext_vector_type (4 ))); // NON_COMPLIANT
45
+ typedef float float2 __attribute__((ext_vector_type (2 ))); // NON_COMPLIANT
46
+
47
+ // Requires additional compiler flags to change the architecture
48
+ // typedef __attribute__((neon_vector_type(8))) int8_t int8x8_t;
49
+ // typedef __attribute__((neon_polyvector_type(16))) poly8_t poly8x16_t;
50
+
51
+ typedef int int4 __attribute__((vector_size (4 * sizeof (int )))); // NON_COMPLIANT
52
+
53
+ typedef int v4si __attribute__((__vector_size__ (16 ))); // NON_COMPLIANT
54
+ typedef float float4 __attribute__((ext_vector_type (4 ))); // NON_COMPLIANT
55
+ typedef float float2 __attribute__((ext_vector_type (2 ))); // NON_COMPLIANT
56
+
57
+ //// GCC features
58
+ void gf1 () {
59
+ ({
60
+ int y = 1 ;
61
+ int z ; // NON_COMPLIANT
62
+ if (y > 0 )
63
+ z = y ;
64
+ else
65
+ z = - y ;
66
+ z ;
67
+ });
68
+ }
69
+
70
+ void gf2 () {
71
+ // __label__ found; -- local labels not supported by clang
72
+ }
73
+
74
+ void gf3 () {
75
+ void * ptr ;
76
+ // goto *ptr; -- not supported in clang
77
+ }
78
+
79
+ void gf4 () {
80
+ // void gf4a(){ -- not supported in clang
81
+ //
82
+ // }
83
+ }
84
+
85
+ void gf5 () {
86
+ __builtin_setjmp (0 ); // NON_COMPLIANT
87
+ __builtin_longjmp (0 , 1 ); // NON_COMPLIANT
88
+ }
89
+
90
+ void gf6 () {
91
+ // not supported by clang
92
+
93
+ //__builtin_apply_args();
94
+ //__builtin_apply(0, 0, 0);
95
+ //__builtin_return(0);
96
+ //__builtin_va_arg_pack();
97
+ //__builtin_va_arg_pack_len();
98
+ }
99
+
100
+ void gf7 () {
101
+ int a = 0 ?: 0 ; // NON_COMPLIANT
102
+ }
103
+
104
+ void gf8 () {
105
+ typeof (int * ); // NON_COMPLIANT
106
+ }
107
+
108
+ void gf9 () {
109
+ __int128 a ; // NON_COMPLIANT
110
+ }
111
+
112
+ void gf10 () {
113
+ long long int a ; // NON_COMPLIANT
114
+ }
115
+
116
+ void gf11 () {
117
+ __real__ (0 ); // NON_COMPLIANT
118
+ __imag__ (0 ); // NON_COMPLIANT
119
+ }
120
+
121
+ void gf12 () {}
122
+
123
+ void gf13 () {
124
+ // not supported on clang
125
+
126
+ //_Decimal32 a;
127
+ //_Decimal64 b;
128
+ //_Decimal128 c;
129
+ }
130
+
131
+ void gf14 () {
132
+ // Not sure how to get this to work.
133
+ // typedef _Complex float __attribute__((mode(TC))) _Complex128;
134
+ // typedef _Complex float __attribute__((mode(XC))) _Complex80;
135
+ }
136
+
137
+ void gf15 () {
138
+ float f = 0x1.fp3 ; // NON_COMPLIANT
139
+ }
140
+
141
+ void gf16 () {
142
+ char contents [0 ]; // NON_COMPLIANT
143
+ }
144
+
145
+ void gf17 () {
146
+ // const __flash char ** p; // not supported in clang
147
+ }
148
+
149
+ void gf18 () {
150
+ // not supported by extractor - checked by looking for flags.
151
+
152
+ // short _Fract, _Fract;
153
+ // long _Fract;
154
+ }
155
+
156
+ struct gf19 {}; // NON_COMPLIANT
157
+
158
+ void gf20 (int n ) {
159
+ // struct S { int x[n]; }; // will never be supported in clang
160
+ }
161
+
162
+ #define gf21 (format , args ...) \
163
+ printf(format, args) // NON_COMPLIANT -- note the issue here is explicitly
164
+ // naming the arguments.
165
+ #define gf21a (format , ...) printf(format, __VA_ARGS__) // COMPLIANT
166
+
167
+ #define gf22 \
168
+ "a" \
169
+ \
170
+ "b" // NON_COMPLIANT - additional spaces after a backslash
171
+ #define gf22a \
172
+ "a" \
173
+ "b" // COMPLIANT
174
+
175
+ struct gf23s {
176
+ int a [1 ];
177
+ };
178
+ struct gf23s gf23f ();
179
+ void gf23 () {
180
+ gf23f ().a [0 ]; // NON_COMPLIANT in C90
181
+ }
182
+
183
+ void gf24 (int f , int g ) {
184
+ float beat_freqs [2 ] = {f - g , f + g }; // NON_COMPLIANT
185
+ }
186
+
187
+ void gf25t (int N , int M , double out [M ][N ], const double in [N ][M ]);
188
+ void gf25 () {
189
+ double x [3 ][2 ];
190
+ double y [2 ][3 ];
191
+ gf25t (3 , 2 , y ,
192
+ x ); // NON_COMPLIANT - in ISO C the const qualifier is formally attached
193
+ // to the element type of the array and not the array itself
194
+ }
195
+
196
+ struct gf26t {
197
+ int a ;
198
+ char b [2 ];
199
+ } gf26v ;
200
+ void gf26 (int x , int y ) {
201
+ gf26v = ((struct gf26t ){x + y , 'z' , 0 }); // NON_COMPLIANT - compound literal
202
+ }
203
+
204
+ void gf27 () {
205
+ int a [6 ] = {[4 ] = 29 , [2 ] = 15 }; // NON_COMPLIANT in C90.
206
+ }
207
+
208
+ void gf28 () {
209
+ int a ;
210
+
211
+ // switch(a){
212
+ // case: 0 ... 5: // Not supported in clang.
213
+ // ;;
214
+ // break;
215
+ // default:
216
+ // ;;
217
+ // break;
218
+ // }
219
+ }
220
+
221
+ union gf29u {
222
+ int i ;
223
+ double j ;
224
+ };
225
+
226
+ void gf29 () {
227
+ int x ;
228
+ int y ;
229
+ union gf29u z ;
230
+ z = (union gf29u )x ; // NON_COMPLIANT
231
+ z = (union gf29u )y ; // NON_COMPLIANT
232
+ }
233
+
234
+ __attribute__((access (read_only , 1 ))) int
235
+ gf30 (const char * ); // NON_COMPLIANT -- attributes are not portable.
236
+
237
+ extern int __attribute__((alias ("var_target" )))
238
+ gf31 ; // NON_COMPLIANT -- attributes are not portable.
239
+
240
+ struct __attribute__((aligned (8 ))) gf32 {
241
+ short f [3 ];
242
+ }; // NON_COMPLIANT -- attributes are not portable.
243
+
244
+ void gf33 () {
245
+ gf33l :
246
+ __attribute__((cold , unused )); // NON_COMPLIANT
247
+ return ;
248
+ }
249
+
250
+ enum gf34 {
251
+ oldval __attribute__ ((deprecated )), // NON_COMPLIANT
252
+ newval
253
+ };
254
+
255
+ void gf35 () {
256
+ int x ;
257
+ // __attribute__((assume(x == 42))); - Not supported in clang
258
+
259
+ switch (x ) {
260
+ case 1 :
261
+ printf ("" );
262
+ __attribute__((fallthrough )); // NON_COMPLIANT
263
+ case 2 :
264
+ break ;
265
+ }
266
+ }
267
+
268
+ // Not supported in clang.
269
+ // int gf36 (uid_t);
270
+
271
+ // int
272
+ // gf36 (int x)
273
+ // {
274
+ // return x == 0;
275
+ // }
276
+
277
+ void gf37 () {
278
+ int a$1 ; // NON_COMPLIANT
279
+ }
280
+
281
+ void gf38 () {
282
+ const char * c = "test\e" ; // NON_COMPLIANT
283
+ }
284
+
285
+ struct gf39s {
286
+ int x ;
287
+ char y ;
288
+ } gf39v ;
289
+
290
+ void gf39 () {
291
+ __alignof__(gf39v .x ); // NON_COMPLIANT
292
+ }
293
+
294
+ // enum gf40 {}; // not supported in clang
295
+
296
+ void gf41 () {
297
+ printf ("__FUNCTION__ = %s\n" , __FUNCTION__ ); // NON_COMPLIANT
298
+ printf ("__PRETTY_FUNCTION__ = %s\n" , __PRETTY_FUNCTION__ ); // NON_COMPLIANT
299
+ }
300
+
301
+ void gf42 () {
302
+ __builtin_extract_return_addr (0 );
303
+ __builtin_frob_return_addr (0 );
304
+ __builtin_frame_address (0 );
305
+ }
306
+
307
+ struct gf43s {
308
+ int x ;
309
+ char y ;
310
+ } gf43v ;
311
+
312
+ void gf43 () {
313
+ __builtin_offsetof (struct gf43s , x ); // NON_COMPLIANT
314
+ }
315
+
316
+ struct gf44s {
317
+ int x ;
318
+ char y ;
319
+ } gf44v ;
320
+
321
+ void gf44 () {
322
+ int i ;
323
+ __sync_fetch_and_add (& i , 0 ); // NON_COMPLIANT
324
+ __sync_fetch_and_sub (& i , 0 ); // NON_COMPLIANT
325
+ __sync_fetch_and_or (& i , 0 ); // NON_COMPLIANT
326
+ __sync_fetch_and_and (& i , 0 ); // NON_COMPLIANT
327
+ __sync_fetch_and_xor (& i , 0 ); // NON_COMPLIANT
328
+ __sync_fetch_and_nand (& i , 0 ); // NON_COMPLIANT
329
+ __sync_add_and_fetch (& i , 0 ); // NON_COMPLIANT
330
+ __sync_sub_and_fetch (& i , 0 ); // NON_COMPLIANT
331
+ __sync_or_and_fetch (& i , 0 ); // NON_COMPLIANT
332
+ __sync_and_and_fetch (& i , 0 ); // NON_COMPLIANT
333
+ __sync_xor_and_fetch (& i , 0 ); // NON_COMPLIANT
334
+ __sync_nand_and_fetch (& i , 0 ); // NON_COMPLIANT
335
+
336
+ __sync_bool_compare_and_swap (& i , 0 , 0 );
337
+ __sync_val_compare_and_swap (& i , 0 , 0 );
338
+ __sync_lock_test_and_set (& i , 0 , 0 );
339
+ __sync_lock_release (& i , 0 );
340
+ }
341
+
342
+ void gf45 () {
343
+ int i = 0b101010 ; // NON_COMPLIANT
344
+ }
345
+
346
+ __thread int gf46 ; // NON_COMPLIANT
347
+
348
+ void gf47 () { // NON_COMPLIANT in versions < C11.
349
+ struct {
350
+ int a ;
351
+ union {
352
+ int b ;
353
+ float c ;
354
+ };
355
+ int d ;
356
+ } f ;
357
+ }
358
+
359
+ void gf48 (){
360
+ __builtin_alloca (0 ); // NON_COMPLIANT (all __builtin functions are non-compliant.)
361
+ }
0 commit comments