Mercurial > hg > tinycc
annotate tests/tcctest.c @ 535:8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 10 Dec 2007 16:11:21 -0600 |
parents | 56fa8cc1b112 |
children |
rev | line source |
---|---|
70 | 1 /* |
531 | 2 * Tinycc auto test program |
70 | 3 */ |
519
ff406be3015d
The old build system doesn't apply to the current source anymore, remove it.
Rob Landley <rob@landley.net>
parents:
488
diff
changeset
|
4 //#include "config.h" |
234 | 5 |
6 #if GCC_MAJOR >= 3 | |
70 | 7 |
8 /* Unfortunately, gcc version < 3 does not handle that! */ | |
234 | 9 #define ALL_ISOC99 |
70 | 10 |
11 /* only gcc 3 handles _Bool correctly */ | |
234 | 12 #define BOOL_ISOC99 |
70 | 13 |
214 | 14 /* gcc 2.95.3 does not handle correctly CR in strings or after strays */ |
234 | 15 #define CORRECT_CR_HANDLING |
16 | |
17 #endif | |
18 | |
333 | 19 /* deprecated and no longer supported in gcc 3.3 */ |
20 //#define ACCEPT_CR_IN_STRINGS | |
21 | |
234 | 22 /* __VA_ARGS__ and __func__ support */ |
23 #define C99_MACROS | |
214 | 24 |
141 | 25 /* test various include syntaxes */ |
26 | |
531 | 27 #define TINYCCLIB_INC <tinyinc.h> |
28 #define TINYCCLIB_INC1 <tinyinc | |
29 #define TINYCCLIB_INC2 h> | |
30 #define TINYCCLIB_INC3 "tinyinc" | |
141 | 31 |
531 | 32 #include TINYCCLIB_INC |
141 | 33 |
531 | 34 #include TINYCCLIB_INC1.TINYCCLIB_INC2 |
141 | 35 |
531 | 36 #include TINYCCLIB_INC1.h> |
141 | 37 |
214 | 38 /* gcc 3.2 does not accept that (bug ?) */ |
531 | 39 //#include TINYCCLIB_INC3 ".h" |
141 | 40 |
531 | 41 #include <tinyinc.h> |
141 | 42 |
531 | 43 #include "tinyinc.h" |
141 | 44 |
70 | 45 void string_test(); |
46 void expr_test(); | |
47 void macro_test(); | |
48 void scope_test(); | |
49 void forward_test(); | |
50 void funcptr_test(); | |
51 void loop_test(); | |
52 void switch_test(); | |
53 void goto_test(); | |
54 void enum_test(); | |
55 void typedef_test(); | |
56 void struct_test(); | |
57 void array_test(); | |
58 void expr_ptr_test(); | |
59 void bool_test(); | |
60 void expr2_test(); | |
61 void constant_expr_test(); | |
62 void expr_cmp_test(); | |
63 void char_short_test(); | |
64 void init_test(void); | |
65 void compound_literal_test(void); | |
66 int kr_test(); | |
112 | 67 void struct_assign_test(void); |
70 | 68 void cast_test(void); |
69 void bitfield_test(void); | |
70 void c99_bool_test(void); | |
71 void float_test(void); | |
72 void longlong_test(void); | |
164 | 73 void stdarg_test(void); |
74 void whitespace_test(void); | |
75 void relocation_test(void); | |
180 | 76 void old_style_function(void); |
77 void sizeof_test(void); | |
78 void typeof_test(void); | |
220 | 79 void local_label_test(void); |
80 void statement_expr_test(void); | |
81 void asm_test(void); | |
256 | 82 void builtin_test(void); |
435
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
83 void static_test(void); |
70 | 84 |
85 int fib(int n); | |
86 void num(int n); | |
87 void forward_ref(void); | |
88 int isid(int c); | |
89 | |
90 #define A 2 | |
91 #define N 1234 + A | |
92 #define pf printf | |
93 #define M1(a, b) (a) + (b) | |
94 | |
207 | 95 #define str\ |
96 (s) # s | |
70 | 97 #define glue(a, b) a ## b |
98 #define xglue(a, b) glue(a, b) | |
99 #define HIGHLOW "hello" | |
100 #define LOW LOW ", world" | |
101 | |
102 #define min(a, b) ((a) < (b) ? (a) : (b)) | |
103 | |
104 #ifdef C99_MACROS | |
105 #define dprintf(level,...) printf(__VA_ARGS__) | |
106 #endif | |
107 | |
112 | 108 /* gcc vararg macros */ |
109 #define dprintf1(level, fmt, args...) printf(fmt, ## args) | |
110 | |
111 #define MACRO_NOARGS() | |
112 | |
70 | 113 #define AAA 3 |
114 #undef AAA | |
115 #define AAA 4 | |
116 | |
84 | 117 #if 1 |
118 #define B3 1 | |
119 #elif 1 | |
120 #define B3 2 | |
121 #elif 0 | |
122 #define B3 3 | |
123 #else | |
124 #define B3 4 | |
125 #endif | |
126 | |
176 | 127 #define __INT64_C(c) c ## LL |
128 #define INT64_MIN (-__INT64_C(9223372036854775807)-1) | |
129 | |
261 | 130 int qq(int x) |
131 { | |
132 return x + 40; | |
133 } | |
134 #define qq(x) x | |
135 | |
378 | 136 #define spin_lock(lock) do { } while (0) |
137 #define wq_spin_lock spin_lock | |
138 #define TEST2() wq_spin_lock(a) | |
139 | |
176 | 140 void macro_test(void) |
70 | 141 { |
164 | 142 printf("macro:\n"); |
70 | 143 pf("N=%d\n", N); |
144 printf("aaa=%d\n", AAA); | |
145 | |
146 printf("min=%d\n", min(1, min(2, -1))); | |
147 | |
148 printf("s1=%s\n", glue(HIGH, LOW)); | |
149 printf("s2=%s\n", xglue(HIGH, LOW)); | |
150 printf("s3=%s\n", str("c")); | |
151 printf("s4=%s\n", str(a1)); | |
84 | 152 printf("B3=%d\n", B3); |
70 | 153 |
154 #ifdef A | |
155 printf("A defined\n"); | |
156 #endif | |
157 #ifdef B | |
158 printf("B defined\n"); | |
159 #endif | |
160 #ifdef A | |
161 printf("A defined\n"); | |
162 #else | |
163 printf("A not defined\n"); | |
164 #endif | |
165 #ifdef B | |
166 printf("B defined\n"); | |
167 #else | |
168 printf("B not defined\n"); | |
169 #endif | |
170 | |
171 #ifdef A | |
172 printf("A defined\n"); | |
173 #ifdef B | |
174 printf("B1 defined\n"); | |
175 #else | |
176 printf("B1 not defined\n"); | |
177 #endif | |
178 #else | |
179 printf("A not defined\n"); | |
180 #ifdef B | |
181 printf("B2 defined\n"); | |
182 #else | |
183 printf("B2 not defined\n"); | |
184 #endif | |
185 #endif | |
186 | |
187 #if 1+1 | |
188 printf("test true1\n"); | |
189 #endif | |
190 #if 0 | |
191 printf("test true2\n"); | |
192 #endif | |
193 #if 1-1 | |
194 printf("test true3\n"); | |
195 #endif | |
196 #if defined(A) | |
197 printf("test trueA\n"); | |
198 #endif | |
199 #if defined(B) | |
200 printf("test trueB\n"); | |
201 #endif | |
202 | |
203 #if 0 | |
204 printf("test 0\n"); | |
205 #elif 0 | |
206 printf("test 1\n"); | |
207 #elif 2 | |
208 printf("test 2\n"); | |
209 #else | |
210 printf("test 3\n"); | |
211 #endif | |
212 | |
112 | 213 MACRO_NOARGS(); |
214 | |
164 | 215 #ifdef __LINE__ |
216 printf("__LINE__ defined\n"); | |
217 #endif | |
218 | |
70 | 219 printf("__LINE__=%d __FILE__=%s\n", |
220 __LINE__, __FILE__); | |
141 | 221 #line 200 |
222 printf("__LINE__=%d __FILE__=%s\n", | |
223 __LINE__, __FILE__); | |
224 #line 203 "test" | |
225 printf("__LINE__=%d __FILE__=%s\n", | |
226 __LINE__, __FILE__); | |
261 | 227 #line 220 "tcctest.c" |
207 | 228 |
70 | 229 /* not strictly preprocessor, but we test it there */ |
230 #ifdef C99_MACROS | |
231 printf("__func__ = %s\n", __func__); | |
232 dprintf(1, "vaarg=%d\n", 1); | |
233 #endif | |
112 | 234 dprintf1(1, "vaarg1\n"); |
235 dprintf1(1, "vaarg1=%d\n", 2); | |
236 dprintf1(1, "vaarg1=%d %d\n", 1, 2); | |
164 | 237 |
238 /* gcc extension */ | |
239 printf("func='%s'\n", __FUNCTION__); | |
176 | 240 |
241 /* complicated macros in glibc */ | |
242 printf("INT64_MIN=%Ld\n", INT64_MIN); | |
180 | 243 { |
244 int a; | |
245 a = 1; | |
246 glue(a+, +); | |
247 printf("a=%d\n", a); | |
248 glue(a <, <= 2); | |
249 printf("a=%d\n", a); | |
250 } | |
207 | 251 |
234 | 252 /* macro function with argument outside the macro string */ |
253 #define MF_s MF_hello | |
254 #define MF_hello(msg) printf("%s\n",msg) | |
255 | |
256 #define MF_t printf("tralala\n"); MF_hello | |
257 | |
258 MF_s("hi"); | |
259 MF_t("hi"); | |
260 | |
261 | 261 /* test macro substituion inside args (should not eat stream) */ |
262 printf("qq=%d\n", qq(qq)(2)); | |
263 | |
266 | 264 /* test zero argument case. NOTE: gcc 2.95.x does not accept a |
265 null argument without a space. gcc 3.2 fixes that. */ | |
266 | |
267 #define qq1(x) 1 | |
268 printf("qq1=%d\n", qq1( )); | |
269 | |
207 | 270 /* comment with stray handling *\ |
271 / | |
234 | 272 /* this is a valid *\/ comment */ |
273 /* this is a valid comment *\*/ | |
274 // this is a valid\ | |
275 comment | |
378 | 276 |
277 /* test function macro substitution when the function name is | |
278 substituted */ | |
279 TEST2(); | |
423
fb849852437e
Dave Dodge's tcc-0.9.23-pp-number-multi-pasting.patch:
Rob Landley <rob@landley.net>
parents:
422
diff
changeset
|
280 |
fb849852437e
Dave Dodge's tcc-0.9.23-pp-number-multi-pasting.patch:
Rob Landley <rob@landley.net>
parents:
422
diff
changeset
|
281 #define PART_ONE(n) (!!((n) & 0xF)) |
fb849852437e
Dave Dodge's tcc-0.9.23-pp-number-multi-pasting.patch:
Rob Landley <rob@landley.net>
parents:
422
diff
changeset
|
282 #define PART_TWO(n) (PART_ONE(n)) |
fb849852437e
Dave Dodge's tcc-0.9.23-pp-number-multi-pasting.patch:
Rob Landley <rob@landley.net>
parents:
422
diff
changeset
|
283 #define PART_THREE(f) PART_TWO(0x##f##U) |
fb849852437e
Dave Dodge's tcc-0.9.23-pp-number-multi-pasting.patch:
Rob Landley <rob@landley.net>
parents:
422
diff
changeset
|
284 printf("Nested macros: %d == 0\n", PART_THREE(0)); |
fb849852437e
Dave Dodge's tcc-0.9.23-pp-number-multi-pasting.patch:
Rob Landley <rob@landley.net>
parents:
422
diff
changeset
|
285 |
70 | 286 } |
287 | |
440
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
288 int some_fn(int x) |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
289 { |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
290 return x; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
291 } |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
292 |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
293 int other_fn(int x) |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
294 { |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
295 return x*2; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
296 } |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
297 |
70 | 298 int op(a,b) |
299 { | |
300 return a / b; | |
301 } | |
302 | |
303 int ret(a) | |
304 { | |
305 if (a == 2) | |
306 return 1; | |
307 if (a == 3) | |
308 return 2; | |
309 return 0; | |
310 } | |
311 | |
253 | 312 void ps(const char *s) |
70 | 313 { |
314 int c; | |
315 while (1) { | |
316 c = *s; | |
317 if (c == 0) | |
318 break; | |
319 printf("%c", c); | |
320 s++; | |
321 } | |
322 } | |
323 | |
234 | 324 const char foo1_string[] = "\ |
325 bar\n\ | |
326 test\14\ | |
327 1"; | |
328 | |
70 | 329 void string_test() |
330 { | |
331 int b; | |
332 printf("string:\n"); | |
333 printf("\141\1423\143\n");/* dezdez test */ | |
334 printf("\x41\x42\x43\x3a\n"); | |
335 printf("c=%c\n", 'r'); | |
336 printf("wc=%C 0x%lx %C\n", L'a', L'\x1234', L'c'); | |
234 | 337 printf("foo1_string='%s'\n", foo1_string); |
207 | 338 #if 0 |
70 | 339 printf("wstring=%S\n", L"abc"); |
340 printf("wstring=%S\n", L"abc" L"def" "ghi"); | |
169 | 341 printf("'\\377'=%d '\\xff'=%d\n", '\377', '\xff'); |
342 printf("L'\\377'=%d L'\\xff'=%d\n", L'\377', L'\xff'); | |
207 | 343 #endif |
114 | 344 ps("test\n"); |
70 | 345 b = 32; |
346 while ((b = b + 1) < 96) { | |
347 printf("%c", b); | |
348 } | |
349 printf("\n"); | |
350 printf("fib=%d\n", fib(33)); | |
351 b = 262144; | |
352 while (b != 0x80000000) { | |
353 num(b); | |
354 b = b * 2; | |
355 } | |
356 } | |
357 | |
358 void loop_test() | |
359 { | |
360 int i; | |
361 i = 0; | |
362 while (i < 10) | |
363 printf("%d", i++); | |
364 printf("\n"); | |
365 for(i = 0; i < 10;i++) | |
366 printf("%d", i); | |
367 printf("\n"); | |
368 i = 0; | |
369 do { | |
370 printf("%d", i++); | |
371 } while (i < 10); | |
372 printf("\n"); | |
373 | |
374 /* break/continue tests */ | |
375 i = 0; | |
376 while (1) { | |
377 if (i == 6) | |
378 break; | |
379 i++; | |
380 if (i == 3) | |
381 continue; | |
382 printf("%d", i); | |
383 } | |
384 printf("\n"); | |
385 | |
386 /* break/continue tests */ | |
387 i = 0; | |
388 do { | |
389 if (i == 6) | |
390 break; | |
391 i++; | |
392 if (i == 3) | |
393 continue; | |
394 printf("%d", i); | |
395 } while(1); | |
396 printf("\n"); | |
397 | |
398 for(i = 0;i < 10;i++) { | |
399 if (i == 3) | |
400 continue; | |
401 printf("%d", i); | |
402 } | |
403 printf("\n"); | |
404 } | |
405 | |
406 | |
407 void goto_test() | |
408 { | |
409 int i; | |
184 | 410 static void *label_table[3] = { &&label1, &&label2, &&label3 }; |
70 | 411 |
412 printf("goto:\n"); | |
413 i = 0; | |
414 s_loop: | |
415 if (i >= 10) | |
416 goto s_end; | |
417 printf("%d", i); | |
418 i++; | |
419 goto s_loop; | |
420 s_end: | |
421 printf("\n"); | |
184 | 422 |
423 /* we also test computed gotos (GCC extension) */ | |
424 for(i=0;i<3;i++) { | |
425 goto *label_table[i]; | |
426 label1: | |
427 printf("label1\n"); | |
428 goto next; | |
429 label2: | |
430 printf("label2\n"); | |
431 goto next; | |
432 label3: | |
433 printf("label3\n"); | |
434 next: ; | |
435 } | |
70 | 436 } |
437 | |
438 enum { | |
439 E0, | |
440 E1 = 2, | |
441 E2 = 4, | |
442 E3, | |
443 E4, | |
444 }; | |
445 | |
446 enum test { | |
447 E5 = 1000, | |
448 }; | |
449 | |
450 void enum_test() | |
451 { | |
452 enum test b1; | |
453 printf("enum:\n%d %d %d %d %d %d\n", | |
454 E0, E1, E2, E3, E4, E5); | |
455 b1 = 1; | |
456 printf("b1=%d\n", b1); | |
457 } | |
458 | |
459 typedef int *my_ptr; | |
460 | |
461 void typedef_test() | |
462 { | |
463 my_ptr a; | |
464 int b; | |
465 a = &b; | |
466 *a = 1234; | |
467 printf("typedef:\n"); | |
468 printf("a=%d\n", *a); | |
469 } | |
470 | |
471 void forward_test() | |
472 { | |
473 printf("forward:\n"); | |
474 forward_ref(); | |
475 forward_ref(); | |
476 } | |
477 | |
478 | |
479 void forward_ref(void) | |
480 { | |
481 printf("forward ok\n"); | |
482 } | |
483 | |
484 typedef struct struct1 { | |
485 int f1; | |
486 int f2, f3; | |
487 union union1 { | |
488 int v1; | |
489 int v2; | |
490 } u; | |
491 char str[3]; | |
492 } struct1; | |
493 | |
494 struct struct2 { | |
495 int a; | |
496 char b; | |
497 }; | |
498 | |
499 union union2 { | |
500 int w1; | |
501 int w2; | |
502 }; | |
503 | |
504 struct struct1 st1, st2; | |
505 | |
506 int main(int argc, char **argv) | |
507 { | |
508 string_test(); | |
509 expr_test(); | |
510 macro_test(); | |
511 scope_test(); | |
512 forward_test(); | |
513 funcptr_test(); | |
514 loop_test(); | |
515 switch_test(); | |
516 goto_test(); | |
517 enum_test(); | |
518 typedef_test(); | |
519 struct_test(); | |
520 array_test(); | |
521 expr_ptr_test(); | |
522 bool_test(); | |
523 expr2_test(); | |
524 constant_expr_test(); | |
525 expr_cmp_test(); | |
526 char_short_test(); | |
527 init_test(); | |
528 compound_literal_test(); | |
529 kr_test(); | |
530 struct_assign_test(); | |
531 cast_test(); | |
532 bitfield_test(); | |
533 c99_bool_test(); | |
534 float_test(); | |
535 longlong_test(); | |
164 | 536 stdarg_test(); |
537 whitespace_test(); | |
538 relocation_test(); | |
180 | 539 old_style_function(); |
540 sizeof_test(); | |
541 typeof_test(); | |
220 | 542 statement_expr_test(); |
543 local_label_test(); | |
544 asm_test(); | |
256 | 545 builtin_test(); |
435
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
546 static_test(); |
70 | 547 return 0; |
548 } | |
549 | |
550 int tab[3]; | |
551 int tab2[3][2]; | |
552 | |
553 int g; | |
554 | |
555 void f1(g) | |
556 { | |
557 printf("g1=%d\n", g); | |
558 } | |
559 | |
560 void scope_test() | |
561 { | |
562 printf("scope:\n"); | |
563 g = 2; | |
564 f1(1); | |
565 printf("g2=%d\n", g); | |
566 { | |
567 int g; | |
568 g = 3; | |
569 printf("g3=%d\n", g); | |
570 { | |
571 int g; | |
572 g = 4; | |
573 printf("g4=%d\n", g); | |
574 } | |
575 } | |
576 printf("g5=%d\n", g); | |
577 } | |
578 | |
579 void array_test(int a[4]) | |
580 { | |
581 int i, j; | |
582 | |
583 printf("array:\n"); | |
584 printf("sizeof(a) = %d\n", sizeof(a)); | |
135 | 585 printf("sizeof(\"a\") = %d\n", sizeof("a")); |
141 | 586 #ifdef C99_MACROS |
135 | 587 printf("sizeof(__func__) = %d\n", sizeof(__func__)); |
141 | 588 #endif |
70 | 589 printf("sizeof tab %d\n", sizeof(tab)); |
590 printf("sizeof tab2 %d\n", sizeof tab2); | |
591 tab[0] = 1; | |
592 tab[1] = 2; | |
593 tab[2] = 3; | |
594 printf("%d %d %d\n", tab[0], tab[1], tab[2]); | |
595 for(i=0;i<3;i++) | |
596 for(j=0;j<2;j++) | |
597 tab2[i][j] = 10 * i + j; | |
598 for(i=0;i<3*2;i++) { | |
599 printf(" %3d", ((int *)tab2)[i]); | |
600 } | |
601 printf("\n"); | |
602 } | |
603 | |
604 void expr_test() | |
605 { | |
606 int a, b; | |
607 a = 0; | |
608 printf("%d\n", a += 1); | |
609 printf("%d\n", a -= 2); | |
610 printf("%d\n", a *= 31232132); | |
611 printf("%d\n", a /= 4); | |
612 printf("%d\n", a %= 20); | |
613 printf("%d\n", a &= 6); | |
614 printf("%d\n", a ^= 7); | |
615 printf("%d\n", a |= 8); | |
616 printf("%d\n", a >>= 3); | |
617 printf("%d\n", a <<= 4); | |
618 | |
619 a = 22321; | |
620 b = -22321; | |
621 printf("%d\n", a + 1); | |
622 printf("%d\n", a - 2); | |
623 printf("%d\n", a * 312); | |
624 printf("%d\n", a / 4); | |
625 printf("%d\n", b / 4); | |
626 printf("%d\n", (unsigned)b / 4); | |
627 printf("%d\n", a % 20); | |
628 printf("%d\n", b % 20); | |
629 printf("%d\n", (unsigned)b % 20); | |
630 printf("%d\n", a & 6); | |
631 printf("%d\n", a ^ 7); | |
632 printf("%d\n", a | 8); | |
633 printf("%d\n", a >> 3); | |
634 printf("%d\n", b >> 3); | |
635 printf("%d\n", (unsigned)b >> 3); | |
636 printf("%d\n", a << 4); | |
637 printf("%d\n", ~a); | |
638 printf("%d\n", -a); | |
639 printf("%d\n", +a); | |
640 | |
641 printf("%d\n", 12 + 1); | |
642 printf("%d\n", 12 - 2); | |
643 printf("%d\n", 12 * 312); | |
644 printf("%d\n", 12 / 4); | |
645 printf("%d\n", 12 % 20); | |
646 printf("%d\n", 12 & 6); | |
647 printf("%d\n", 12 ^ 7); | |
648 printf("%d\n", 12 | 8); | |
649 printf("%d\n", 12 >> 2); | |
650 printf("%d\n", 12 << 4); | |
651 printf("%d\n", ~12); | |
652 printf("%d\n", -12); | |
653 printf("%d\n", +12); | |
654 printf("%d %d %d %d\n", | |
655 isid('a'), | |
656 isid('g'), | |
657 isid('T'), | |
658 isid('(')); | |
437
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
659 |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
660 { |
531 | 661 /* Check that tinycc saves registers before a conditional jump */ |
437
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
662 /* Addresses bug "grischka case_2" */ |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
663 struct test_str { int a, b, c; }; |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
664 struct test_str t1 = {0,0,0}; |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
665 struct test_str t2 = {1,1,1}; |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
666 struct test_str *p1 = &t1; |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
667 struct test_str *p2 = &t2; |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
668 int f = 0; |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
669 int g = 0; |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
670 |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
671 p1->b = f==0 || isid(0); |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
672 printf("case_2.1: Expect 0 1 0 -> %d %d %d\n", p1->a, p1->b, p1->c); |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
673 p1->c = !f || isid(0); |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
674 printf("case_2.2: Expect 0 1 1 -> %d %d %d\n", p1->a, p1->b, p1->c); |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
675 |
531 | 676 /* This will crash old versions of tinycc during compilation: */ |
437
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
677 p2->b = (f==1) && isid(0); |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
678 printf("case_2.1AND: Expect 0 1 0 -> %d %d %d\n", p2->a, p2->b, p2->c); |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
679 p2->b = (!(f==1)) && isid(0); |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
680 printf("case_2.2AND: Expect 0 1 0 -> %d %d %d\n", p2->a, p2->b, p2->c); |
3f48bed56ab4
Fix bug in ||, &&, ! (save registers through jumps), grischka-2005-09-25 case_2
Rob Landley <rob@landley.net>
parents:
435
diff
changeset
|
681 } |
70 | 682 } |
683 | |
684 int isid(int c) | |
685 { | |
686 return (c >= 'a' & c <= 'z') | (c >= 'A' & c <= 'Z') | c == '_'; | |
687 } | |
688 | |
689 /**********************/ | |
690 | |
691 int vstack[10], *vstack_ptr; | |
692 | |
693 void vpush(int vt, int vc) | |
694 { | |
695 *vstack_ptr++ = vt; | |
696 *vstack_ptr++ = vc; | |
697 } | |
698 | |
699 void vpop(int *ft, int *fc) | |
700 { | |
701 *fc = *--vstack_ptr; | |
702 *ft = *--vstack_ptr; | |
703 } | |
704 | |
705 void expr2_test() | |
706 { | |
707 int a, b; | |
708 | |
709 printf("expr2:\n"); | |
710 vstack_ptr = vstack; | |
711 vpush(1432432, 2); | |
712 vstack_ptr[-2] &= ~0xffffff80; | |
713 vpop(&a, &b); | |
714 printf("res= %d %d\n", a, b); | |
715 } | |
716 | |
535
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
717 int constant_i = "blah" && 0; |
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
718 int constant_j = "blah" || 0; |
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
719 int constant_k = vpop && 0; |
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
720 int constant_l = "blah" && 1; |
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
721 int constant_m = "blah" || 1; |
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
722 int constant_n = 0 || vpop; |
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
723 |
70 | 724 void constant_expr_test() |
725 { | |
726 int a; | |
727 printf("constant_expr:\n"); | |
728 a = 3; | |
729 printf("%d\n", a * 16); | |
730 printf("%d\n", a * 1); | |
731 printf("%d\n", a + 0); | |
535
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
732 printf("%d %d %d %d %d %d\n",constant_i,constant_j,constant_k,constant_l, |
8591acf8ce9f
Fix gen_opic() to properly &&, ||, and == NULL against symbols. Add test.
Rob Landley <rob@landley.net>
parents:
531
diff
changeset
|
733 constant_m,constant_n); |
70 | 734 } |
735 | |
736 int tab4[10]; | |
737 | |
738 void expr_ptr_test() | |
739 { | |
740 int *p, *q; | |
741 | |
742 printf("expr_ptr:\n"); | |
743 p = tab4; | |
744 q = tab4 + 10; | |
745 printf("diff=%d\n", q - p); | |
746 p++; | |
747 printf("inc=%d\n", p - tab4); | |
748 p--; | |
749 printf("dec=%d\n", p - tab4); | |
750 ++p; | |
751 printf("inc=%d\n", p - tab4); | |
752 --p; | |
753 printf("dec=%d\n", p - tab4); | |
754 printf("add=%d\n", p + 3 - tab4); | |
755 printf("add=%d\n", 3 + p - tab4); | |
756 } | |
757 | |
758 void expr_cmp_test() | |
759 { | |
760 int a, b; | |
761 printf("constant_expr:\n"); | |
762 a = -1; | |
763 b = 1; | |
764 printf("%d\n", a == a); | |
765 printf("%d\n", a != a); | |
766 | |
767 printf("%d\n", a < b); | |
768 printf("%d\n", a <= b); | |
769 printf("%d\n", a <= a); | |
770 printf("%d\n", b >= a); | |
771 printf("%d\n", a >= a); | |
772 printf("%d\n", b > a); | |
773 | |
774 printf("%d\n", (unsigned)a < b); | |
775 printf("%d\n", (unsigned)a <= b); | |
776 printf("%d\n", (unsigned)a <= a); | |
777 printf("%d\n", (unsigned)b >= a); | |
778 printf("%d\n", (unsigned)a >= a); | |
779 printf("%d\n", (unsigned)b > a); | |
780 } | |
781 | |
207 | 782 struct empty { |
783 }; | |
784 | |
785 struct aligntest1 { | |
786 char a[10]; | |
787 }; | |
788 | |
789 struct aligntest2 { | |
790 int a; | |
791 char b[10]; | |
792 }; | |
793 | |
794 struct aligntest3 { | |
795 double a, b; | |
796 }; | |
797 | |
798 struct aligntest4 { | |
799 double a[0]; | |
800 }; | |
801 | |
70 | 802 void struct_test() |
803 { | |
804 struct1 *s; | |
805 union union2 u; | |
473
ec2b47ce2530
Joshua Phillips fixed size of structs with empty array member.
Rob Landley <rob@landley.net>
parents:
472
diff
changeset
|
806 struct foo { |
ec2b47ce2530
Joshua Phillips fixed size of structs with empty array member.
Rob Landley <rob@landley.net>
parents:
472
diff
changeset
|
807 int a; |
ec2b47ce2530
Joshua Phillips fixed size of structs with empty array member.
Rob Landley <rob@landley.net>
parents:
472
diff
changeset
|
808 void *b[]; |
ec2b47ce2530
Joshua Phillips fixed size of structs with empty array member.
Rob Landley <rob@landley.net>
parents:
472
diff
changeset
|
809 }; |
70 | 810 |
811 printf("struct:\n"); | |
812 printf("sizes: %d %d %d %d\n", | |
813 sizeof(struct struct1), | |
814 sizeof(struct struct2), | |
815 sizeof(union union1), | |
816 sizeof(union union2)); | |
817 st1.f1 = 1; | |
818 st1.f2 = 2; | |
819 st1.f3 = 3; | |
820 printf("st1: %d %d %d\n", | |
821 st1.f1, st1.f2, st1.f3); | |
822 st1.u.v1 = 1; | |
823 st1.u.v2 = 2; | |
824 printf("union1: %d\n", st1.u.v1); | |
825 u.w1 = 1; | |
826 u.w2 = 2; | |
827 printf("union2: %d\n", u.w1); | |
828 s = &st2; | |
829 s->f1 = 3; | |
830 s->f2 = 2; | |
831 s->f3 = 1; | |
832 printf("st2: %d %d %d\n", | |
833 s->f1, s->f2, s->f3); | |
834 printf("str_addr=%x\n", (int)st1.str - (int)&st1.f1); | |
207 | 835 |
836 /* align / size tests */ | |
837 printf("aligntest1 sizeof=%d alignof=%d\n", | |
838 sizeof(struct aligntest1), __alignof__(struct aligntest1)); | |
839 printf("aligntest2 sizeof=%d alignof=%d\n", | |
840 sizeof(struct aligntest2), __alignof__(struct aligntest2)); | |
841 printf("aligntest3 sizeof=%d alignof=%d\n", | |
842 sizeof(struct aligntest3), __alignof__(struct aligntest3)); | |
843 printf("aligntest4 sizeof=%d alignof=%d\n", | |
844 sizeof(struct aligntest4), __alignof__(struct aligntest4)); | |
845 | |
846 /* empty structures (GCC extension) */ | |
847 printf("sizeof(struct empty) = %d\n", sizeof(struct empty)); | |
848 printf("alignof(struct empty) = %d\n", __alignof__(struct empty)); | |
473
ec2b47ce2530
Joshua Phillips fixed size of structs with empty array member.
Rob Landley <rob@landley.net>
parents:
472
diff
changeset
|
849 |
ec2b47ce2530
Joshua Phillips fixed size of structs with empty array member.
Rob Landley <rob@landley.net>
parents:
472
diff
changeset
|
850 // Struct with zero size member. |
ec2b47ce2530
Joshua Phillips fixed size of structs with empty array member.
Rob Landley <rob@landley.net>
parents:
472
diff
changeset
|
851 printf("sizeof(struct foo)=%d\n", sizeof(struct foo)); |
70 | 852 } |
853 | |
854 /* XXX: depend on endianness */ | |
855 void char_short_test() | |
856 { | |
857 int var1, var2; | |
858 | |
859 printf("char_short:\n"); | |
860 | |
861 var1 = 0x01020304; | |
862 var2 = 0xfffefdfc; | |
863 printf("s8=%d %d\n", | |
864 *(char *)&var1, *(char *)&var2); | |
865 printf("u8=%d %d\n", | |
866 *(unsigned char *)&var1, *(unsigned char *)&var2); | |
867 printf("s16=%d %d\n", | |
868 *(short *)&var1, *(short *)&var2); | |
869 printf("u16=%d %d\n", | |
870 *(unsigned short *)&var1, *(unsigned short *)&var2); | |
871 printf("s32=%d %d\n", | |
872 *(int *)&var1, *(int *)&var2); | |
873 printf("u32=%d %d\n", | |
874 *(unsigned int *)&var1, *(unsigned int *)&var2); | |
875 *(char *)&var1 = 0x08; | |
876 printf("var1=%x\n", var1); | |
877 *(short *)&var1 = 0x0809; | |
878 printf("var1=%x\n", var1); | |
879 *(int *)&var1 = 0x08090a0b; | |
880 printf("var1=%x\n", var1); | |
881 } | |
882 | |
883 /******************/ | |
884 | |
885 typedef struct Sym { | |
886 int v; | |
887 int t; | |
888 int c; | |
889 struct Sym *next; | |
890 struct Sym *prev; | |
891 } Sym; | |
892 | |
207 | 893 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') |
894 #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) | |
895 | |
896 static int toupper1(int a) | |
897 { | |
898 return TOUPPER(a); | |
899 } | |
900 | |
70 | 901 void bool_test() |
902 { | |
207 | 903 int *s, a, b, t, f, i; |
70 | 904 |
905 a = 0; | |
906 s = (void*)0; | |
907 printf("!s=%d\n", !s); | |
908 | |
909 if (!s || !s[0]) | |
910 a = 1; | |
911 printf("a=%d\n", a); | |
912 | |
913 printf("a=%d %d %d\n", 0 || 0, 0 || 1, 1 || 1); | |
914 printf("a=%d %d %d\n", 0 && 0, 0 && 1, 1 && 1); | |
915 printf("a=%d %d\n", 1 ? 1 : 0, 0 ? 1 : 0); | |
916 #if 1 && 1 | |
917 printf("a1\n"); | |
918 #endif | |
919 #if 1 || 0 | |
920 printf("a2\n"); | |
921 #endif | |
922 #if 1 ? 0 : 1 | |
923 printf("a3\n"); | |
924 #endif | |
925 #if 0 ? 0 : 1 | |
926 printf("a4\n"); | |
927 #endif | |
928 | |
929 a = 4; | |
930 printf("b=%d\n", a + (0 ? 1 : a / 2)); | |
112 | 931 |
932 /* test register spilling */ | |
933 a = 10; | |
934 b = 10; | |
935 a = (a + b) * ((a < b) ? | |
936 ((b - a) * (a - b)): a + b); | |
937 printf("a=%d\n", a); | |
169 | 938 |
939 /* test complex || or && expressions */ | |
940 t = 1; | |
941 f = 0; | |
942 a = 32; | |
943 printf("exp=%d\n", f == (32 <= a && a <= 3)); | |
944 printf("r=%d\n", (t || f) + (t && f)); | |
945 | |
946 /* test ? : cast */ | |
947 { | |
948 int aspect_on; | |
949 int aspect_native = 65536; | |
950 double bfu_aspect = 1.0; | |
951 int aspect; | |
952 for(aspect_on = 0; aspect_on < 2; aspect_on++) { | |
953 aspect=aspect_on?(aspect_native*bfu_aspect+0.5):65535UL; | |
954 printf("aspect=%d\n", aspect); | |
955 } | |
956 } | |
207 | 957 |
440
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
958 /* Test passing structs & function pointers though conditional |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
959 * operator ? :. This is bug grischka-20050929 case_1 */ |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
960 { |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
961 struct test1 { int a, b, c; }; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
962 struct test1 t0 = {10,20,30}; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
963 struct test1 t1 = {11,21,31}; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
964 struct test1 tx = {0,0,0}; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
965 int (*pfn)(int); |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
966 int f = 0; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
967 |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
968 tx = f==0 ? t0 : t1; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
969 printf("case_1.1: 10,20,30 -> %d,%d,%d\n", tx.a, tx.b, tx.c); |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
970 |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
971 /* This tests to see that function pointers correctly pass through |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
972 the conditional operator ?:. This tests for |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
973 grischka-20050929 case_1.2. Note that this was already FIXED |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
974 in rl-1.0.0, but we want to TEST for it too. */ |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
975 pfn = f ? some_fn : other_fn; |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
976 printf("case_1.2: other -> %s\n", 1==pfn(1)?"some":"other"); |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
977 } |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
978 |
bbcb7f4bafe5
Pass structures through ?:, test for function pointers too
Rob Landley <rob@landley.net>
parents:
439
diff
changeset
|
979 |
220 | 980 /* test ? : GCC extension */ |
981 { | |
982 static int v1 = 34 ? : -1; /* constant case */ | |
983 static int v2 = 0 ? : -1; /* constant case */ | |
984 int a = 30; | |
985 | |
986 printf("%d %d\n", v1, v2); | |
987 printf("%d %d\n", a - 30 ? : a * 2, a + 1 ? : a * 2); | |
988 } | |
989 | |
207 | 990 /* again complex expression */ |
991 for(i=0;i<256;i++) { | |
992 if (toupper1 (i) != TOUPPER (i)) | |
993 printf("error %d\n", i); | |
994 } | |
432
01fb5d2a496e
Fix nonconstant double->bool conversion (grischka-2005-09-25 bugfix 6.2).
Rob Landley <rob@landley.net>
parents:
423
diff
changeset
|
995 |
70 | 996 } |
997 | |
220 | 998 /* GCC accepts that */ |
999 static int tab_reinit[]; | |
1000 static int tab_reinit[10]; | |
70 | 1001 |
220 | 1002 //int cinit1; /* a global variable can be defined several times without error ! */ |
1003 int cinit1; | |
1004 int cinit1; | |
70 | 1005 int cinit1 = 0; |
1006 int *cinit2 = (int []){3, 2, 1}; | |
1007 | |
1008 void compound_literal_test(void) | |
1009 { | |
1010 int *p, i; | |
1011 char *q, *q3; | |
1012 | |
1013 printf("compound_test:\n"); | |
1014 | |
1015 p = (int []){1, 2, 3}; | |
1016 for(i=0;i<3;i++) | |
1017 printf(" %d", p[i]); | |
1018 printf("\n"); | |
1019 | |
1020 for(i=0;i<3;i++) | |
1021 printf("%d", cinit2[i]); | |
1022 printf("\n"); | |
1023 | |
1024 q = "tralala1"; | |
1025 printf("q1=%s\n", q); | |
1026 | |
1027 q = (char *){ "tralala2" }; | |
1028 printf("q2=%s\n", q); | |
1029 | |
1030 q3 = (char *){ q }; | |
1031 printf("q3=%s\n", q3); | |
1032 | |
1033 q = (char []){ "tralala3" }; | |
1034 printf("q4=%s\n", q); | |
1035 | |
1036 #ifdef ALL_ISOC99 | |
1037 p = (int []){1, 2, cinit1 + 3}; | |
1038 for(i=0;i<3;i++) | |
1039 printf(" %d", p[i]); | |
1040 printf("\n"); | |
1041 | |
1042 for(i=0;i<3;i++) { | |
1043 p = (int []){1, 2, 4 + i}; | |
1044 printf("%d %d %d\n", | |
1045 p[0], | |
1046 p[1], | |
1047 p[2]); | |
1048 } | |
1049 #endif | |
1050 } | |
1051 | |
1052 /* K & R protos */ | |
1053 | |
1054 kr_func1(a, b) | |
1055 { | |
1056 return a + b; | |
1057 } | |
1058 | |
1059 int kr_func2(a, b) | |
1060 { | |
1061 return a + b; | |
1062 } | |
1063 | |
1064 kr_test() | |
1065 { | |
1066 printf("kr_test:\n"); | |
1067 printf("func1=%d\n", kr_func1(3, 4)); | |
1068 printf("func2=%d\n", kr_func2(3, 4)); | |
1069 return 0; | |
1070 } | |
1071 | |
1072 void num(int n) | |
1073 { | |
1074 char *tab, *p; | |
1075 tab = (char*)malloc(20); | |
1076 p = tab; | |
1077 while (1) { | |
1078 *p = 48 + (n % 10); | |
1079 p++; | |
1080 n = n / 10; | |
1081 if (n == 0) | |
1082 break; | |
1083 } | |
1084 while (p != tab) { | |
1085 p--; | |
1086 printf("%c", *p); | |
1087 } | |
1088 printf("\n"); | |
1089 } | |
1090 | |
1091 /* structure assignment tests */ | |
1092 struct structa1 { | |
1093 int f1; | |
1094 char f2; | |
1095 }; | |
1096 | |
1097 struct structa1 ssta1; | |
1098 | |
1099 void struct_assign_test1(struct structa1 s1, int t) | |
1100 { | |
1101 printf("%d %d %d\n", s1.f1, s1.f2, t); | |
1102 } | |
1103 | |
1104 struct structa1 struct_assign_test2(struct structa1 s1, int t) | |
1105 { | |
1106 s1.f1 += t; | |
1107 s1.f2 -= t; | |
1108 return s1; | |
1109 } | |
1110 | |
438
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1111 void struct_assign_test3(void) |
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1112 { |
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1113 // incompatible assigment |
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1114 struct _s1 { int a, b, c; } *p1 = NULL; |
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1115 struct _s2 { int a, b, c; } *p2 = p1; //warning |
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1116 printf("struct assign, 0 -> %x\n", p2); |
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1117 } |
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1118 |
112 | 1119 void struct_assign_test(void) |
70 | 1120 { |
1121 struct structa1 lsta1, lsta2; | |
1122 | |
112 | 1123 #if 0 |
70 | 1124 printf("struct_assign_test:\n"); |
1125 | |
1126 lsta1.f1 = 1; | |
1127 lsta1.f2 = 2; | |
1128 printf("%d %d\n", lsta1.f1, lsta1.f2); | |
1129 lsta2 = lsta1; | |
1130 printf("%d %d\n", lsta2.f1, lsta2.f2); | |
112 | 1131 #else |
1132 lsta2.f1 = 1; | |
1133 lsta2.f2 = 2; | |
1134 #endif | |
70 | 1135 struct_assign_test1(lsta2, 3); |
1136 | |
1137 printf("before call: %d %d\n", lsta2.f1, lsta2.f2); | |
1138 lsta2 = struct_assign_test2(lsta2, 4); | |
1139 printf("after call: %d %d\n", lsta2.f1, lsta2.f2); | |
438
31171653b1ee
Permit certain pointer assignments (grischka-2005-09-25 case_7)
Rob Landley <rob@landley.net>
parents:
437
diff
changeset
|
1140 struct_assign_test3(); |
70 | 1141 } |
1142 | |
1143 /* casts to short/char */ | |
1144 | |
1145 void cast1(char a, short b, unsigned char c, unsigned short d) | |
1146 { | |
1147 printf("%d %d %d %d\n", a, b, c, d); | |
1148 } | |
1149 | |
1150 char bcast; | |
1151 short scast; | |
1152 | |
1153 void cast_test() | |
1154 { | |
1155 int a; | |
112 | 1156 char c; |
1157 char tab[10]; | |
402 | 1158 unsigned b,d; |
401
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1159 short s; |
432
01fb5d2a496e
Fix nonconstant double->bool conversion (grischka-2005-09-25 bugfix 6.2).
Rob Landley <rob@landley.net>
parents:
423
diff
changeset
|
1160 double g = 0.1; |
474
254e8668fb9d
Another fix from Joshua Phillips, for casting between pointers to integers of
Rob Landley <rob@landley.net>
parents:
473
diff
changeset
|
1161 char *data = "\x34\x34\x12"; |
70 | 1162 |
1163 printf("cast_test:\n"); | |
1164 a = 0xfffff; | |
1165 cast1(a, a, a, a); | |
1166 a = 0xffffe; | |
1167 printf("%d %d %d %d\n", | |
1168 (char)(a + 1), | |
1169 (short)(a + 1), | |
1170 (unsigned char)(a + 1), | |
1171 (unsigned short)(a + 1)); | |
1172 printf("%d %d %d %d\n", | |
1173 (char)0xfffff, | |
1174 (short)0xfffff, | |
1175 (unsigned char)0xfffff, | |
1176 (unsigned short)0xfffff); | |
1177 | |
1178 a = (bcast = 128) + 1; | |
1179 printf("%d\n", a); | |
1180 a = (scast = 65536) + 1; | |
1181 printf("%d\n", a); | |
112 | 1182 |
1183 printf("sizeof(c) = %d, sizeof((int)c) = %d\n", sizeof(c), sizeof((int)c)); | |
1184 | |
401
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1185 /* test cast from unsigned to signed short to int */ |
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1186 b = 0xf000; |
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1187 d = (short)b; |
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1188 printf("((unsigned)(short)0x%08x) = 0x%08x\n", b, d); |
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1189 b = 0xf0f0; |
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1190 d = (char)b; |
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1191 printf("((unsigned)(char)0x%08x) = 0x%08x\n", b, d); |
2707893d0c57
Fix from David Heine for tcc typecast sign extension bug. For details, see
landley@driftwood
parents:
393
diff
changeset
|
1192 |
434
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1193 /* Try casting pointer to short or _Bool (grishka case_6.1). This |
531 | 1194 * is lossy, so tinycc will print a warning. This capability is needed |
434
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1195 * to compile gcc 2.95 as well as other programs. */ |
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1196 { |
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1197 void *p = (void *) 3; |
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1198 printf("Expect 3 1 -> %hd %hhd\n", |
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1199 (short) p, (_Bool) p); /* Expect warning */ |
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1200 } |
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1201 |
98a68386c5a6
Support casting pointer to short or _Bool (grischka-2005-09-25 bugfix 6.1).
Rob Landley <rob@landley.net>
parents:
432
diff
changeset
|
1202 |
112 | 1203 /* test implicit int casting for array accesses */ |
1204 c = 0; | |
1205 tab[1] = 2; | |
1206 tab[c] = 1; | |
1207 printf("%d %d\n", tab[0], tab[1]); | |
135 | 1208 |
1209 /* test implicit casting on some operators */ | |
1210 printf("sizeof(+(char)'a') = %d\n", sizeof(+(char)'a')); | |
1211 printf("sizeof(-(char)'a') = %d\n", sizeof(-(char)'a')); | |
1212 printf("sizeof(~(char)'a') = %d\n", sizeof(-(char)'a')); | |
406
204dee5c5152
Patch from Marcelo Jimenez <marcelo.jimenez@gmail.com> fixing the
landley@driftwood
parents:
404
diff
changeset
|
1213 |
204dee5c5152
Patch from Marcelo Jimenez <marcelo.jimenez@gmail.com> fixing the
landley@driftwood
parents:
404
diff
changeset
|
1214 /* Cast float to bool */ |
204dee5c5152
Patch from Marcelo Jimenez <marcelo.jimenez@gmail.com> fixing the
landley@driftwood
parents:
404
diff
changeset
|
1215 printf("%d\n", (_Bool) 0.1); |
432
01fb5d2a496e
Fix nonconstant double->bool conversion (grischka-2005-09-25 bugfix 6.2).
Rob Landley <rob@landley.net>
parents:
423
diff
changeset
|
1216 /* Cast non-constant double 0.1 to bool, should be 1, grischka case 6.2 */ |
01fb5d2a496e
Fix nonconstant double->bool conversion (grischka-2005-09-25 bugfix 6.2).
Rob Landley <rob@landley.net>
parents:
423
diff
changeset
|
1217 printf("1 -> %d\n", (_Bool) g); |
421
ffd17713a155
Add test for sign extension thing (commit 401).
Rob Landley <rob@landley.net>
parents:
418
diff
changeset
|
1218 |
ffd17713a155
Add test for sign extension thing (commit 401).
Rob Landley <rob@landley.net>
parents:
418
diff
changeset
|
1219 /* Cast with sign extension */ |
ffd17713a155
Add test for sign extension thing (commit 401).
Rob Landley <rob@landley.net>
parents:
418
diff
changeset
|
1220 a = (short)0xf000; |
ffd17713a155
Add test for sign extension thing (commit 401).
Rob Landley <rob@landley.net>
parents:
418
diff
changeset
|
1221 printf("0x%x == 0xfffff000\n", a); |
ffd17713a155
Add test for sign extension thing (commit 401).
Rob Landley <rob@landley.net>
parents:
418
diff
changeset
|
1222 a = (signed char)0xf0f0; |
ffd17713a155
Add test for sign extension thing (commit 401).
Rob Landley <rob@landley.net>
parents:
418
diff
changeset
|
1223 printf("0x%x == 0xfffffff0\n", a); |
474
254e8668fb9d
Another fix from Joshua Phillips, for casting between pointers to integers of
Rob Landley <rob@landley.net>
parents:
473
diff
changeset
|
1224 |
254e8668fb9d
Another fix from Joshua Phillips, for casting between pointers to integers of
Rob Landley <rob@landley.net>
parents:
473
diff
changeset
|
1225 // Casting between pointers of different sizes. |
254e8668fb9d
Another fix from Joshua Phillips, for casting between pointers to integers of
Rob Landley <rob@landley.net>
parents:
473
diff
changeset
|
1226 s = *(short*)&data[1]; |
254e8668fb9d
Another fix from Joshua Phillips, for casting between pointers to integers of
Rob Landley <rob@landley.net>
parents:
473
diff
changeset
|
1227 printf("0x%x == 0x1234 (or 0x3412)\n", s); |
70 | 1228 } |
1229 | |
1230 /* initializers tests */ | |
1231 struct structinit1 { | |
1232 int f1; | |
1233 char f2; | |
1234 short f3; | |
1235 int farray[3]; | |
1236 }; | |
1237 | |
1238 int sinit1 = 2; | |
1239 int sinit2 = { 3 }; | |
1240 int sinit3[3] = { 1, 2, {{3}}, }; | |
1241 int sinit4[3][2] = { {1, 2}, {3, 4}, {5, 6} }; | |
1242 int sinit5[3][2] = { 1, 2, 3, 4, 5, 6 }; | |
1243 int sinit6[] = { 1, 2, 3 }; | |
1244 int sinit7[] = { [2] = 3, [0] = 1, 2 }; | |
1245 char sinit8[] = "hello" "trala"; | |
1246 | |
1247 struct structinit1 sinit9 = { 1, 2, 3 }; | |
1248 struct structinit1 sinit10 = { .f2 = 2, 3, .f1 = 1 }; | |
1249 struct structinit1 sinit11 = { .f2 = 2, 3, .f1 = 1, | |
1250 #ifdef ALL_ISOC99 | |
1251 .farray[0] = 10, | |
1252 .farray[1] = 11, | |
1253 .farray[2] = 12, | |
1254 #endif | |
1255 }; | |
1256 | |
1257 char *sinit12 = "hello world"; | |
1258 char *sinit13[] = { | |
1259 "test1", | |
1260 "test2", | |
1261 "test3", | |
1262 }; | |
1263 char sinit14[10] = { "abc" }; | |
112 | 1264 int sinit15[3] = { sizeof(sinit15), 1, 2 }; |
70 | 1265 |
207 | 1266 struct { int a[3], b; } sinit16[] = { { 1 }, 2 }; |
1267 | |
1268 struct bar { | |
1269 char *s; | |
1270 int len; | |
1271 } sinit17[] = { | |
1272 "a1", 4, | |
1273 "a2", 1 | |
1274 }; | |
1275 | |
220 | 1276 int sinit18[10] = { |
1277 [2 ... 5] = 20, | |
1278 2, | |
1279 [8] = 10, | |
1280 }; | |
1281 | |
70 | 1282 void init_test(void) |
1283 { | |
1284 int linit1 = 2; | |
1285 int linit2 = { 3 }; | |
1286 int linit4[3][2] = { {1, 2}, {3, 4}, {5, 6} }; | |
1287 int linit6[] = { 1, 2, 3 }; | |
1288 int i, j; | |
1289 char linit8[] = "hello" "trala"; | |
1290 int linit12[10] = { 1, 2 }; | |
1291 int linit13[10] = { 1, 2, [7] = 3, [3] = 4, }; | |
1292 char linit14[10] = "abc"; | |
1293 int linit15[10] = { linit1, linit1 + 1, [6] = linit1 + 2, }; | |
1294 struct linit16 { int a1, a2, a3, a4; } linit16 = { 1, .a3 = 2 }; | |
112 | 1295 int linit17 = sizeof(linit17); |
70 | 1296 |
1297 printf("init_test:\n"); | |
1298 | |
1299 printf("sinit1=%d\n", sinit1); | |
1300 printf("sinit2=%d\n", sinit2); | |
1301 printf("sinit3=%d %d %d %d\n", | |
1302 sizeof(sinit3), | |
1303 sinit3[0], | |
1304 sinit3[1], | |
1305 sinit3[2] | |
1306 ); | |
1307 printf("sinit6=%d\n", sizeof(sinit6)); | |
1308 printf("sinit7=%d %d %d %d\n", | |
1309 sizeof(sinit7), | |
1310 sinit7[0], | |
1311 sinit7[1], | |
1312 sinit7[2] | |
1313 ); | |
1314 printf("sinit8=%s\n", sinit8); | |
1315 printf("sinit9=%d %d %d\n", | |
1316 sinit9.f1, | |
1317 sinit9.f2, | |
1318 sinit9.f3 | |
1319 ); | |
1320 printf("sinit10=%d %d %d\n", | |
1321 sinit10.f1, | |
1322 sinit10.f2, | |
1323 sinit10.f3 | |
1324 ); | |
1325 printf("sinit11=%d %d %d %d %d %d\n", | |
1326 sinit11.f1, | |
1327 sinit11.f2, | |
1328 sinit11.f3, | |
1329 sinit11.farray[0], | |
1330 sinit11.farray[1], | |
1331 sinit11.farray[2] | |
1332 ); | |
1333 | |
1334 for(i=0;i<3;i++) | |
1335 for(j=0;j<2;j++) | |
1336 printf("[%d][%d] = %d %d %d\n", | |
1337 i, j, sinit4[i][j], sinit5[i][j], linit4[i][j]); | |
1338 printf("linit1=%d\n", linit1); | |
1339 printf("linit2=%d\n", linit2); | |
1340 printf("linit6=%d\n", sizeof(linit6)); | |
1341 printf("linit8=%d %s\n", sizeof(linit8), linit8); | |
1342 | |
1343 printf("sinit12=%s\n", sinit12); | |
1344 printf("sinit13=%d %s %s %s\n", | |
1345 sizeof(sinit13), | |
1346 sinit13[0], | |
1347 sinit13[1], | |
1348 sinit13[2]); | |
1349 printf("sinit14=%s\n", sinit14); | |
1350 | |
1351 for(i=0;i<10;i++) printf(" %d", linit12[i]); | |
1352 printf("\n"); | |
1353 for(i=0;i<10;i++) printf(" %d", linit13[i]); | |
1354 printf("\n"); | |
1355 for(i=0;i<10;i++) printf(" %d", linit14[i]); | |
1356 printf("\n"); | |
1357 for(i=0;i<10;i++) printf(" %d", linit15[i]); | |
1358 printf("\n"); | |
1359 printf("%d %d %d %d\n", | |
1360 linit16.a1, | |
1361 linit16.a2, | |
1362 linit16.a3, | |
1363 linit16.a4); | |
112 | 1364 /* test that initialisation is done after variable declare */ |
1365 printf("linit17=%d\n", linit17); | |
1366 printf("sinit15=%d\n", sinit15[0]); | |
207 | 1367 printf("sinit16=%d %d\n", sinit16[0].a[0], sinit16[1].a[0]); |
1368 printf("sinit17=%s %d %s %d\n", | |
1369 sinit17[0].s, sinit17[0].len, | |
1370 sinit17[1].s, sinit17[1].len); | |
220 | 1371 for(i=0;i<10;i++) |
1372 printf("%x ", sinit18[i]); | |
1373 printf("\n"); | |
70 | 1374 } |
1375 | |
220 | 1376 |
70 | 1377 void switch_test() |
1378 { | |
1379 int i; | |
1380 | |
1381 for(i=0;i<15;i++) { | |
1382 switch(i) { | |
1383 case 0: | |
1384 case 1: | |
1385 printf("a"); | |
1386 break; | |
1387 default: | |
1388 printf("%d", i); | |
1389 break; | |
1390 case 8 ... 12: | |
1391 printf("c"); | |
1392 break; | |
1393 case 3: | |
1394 printf("b"); | |
1395 break; | |
1396 } | |
1397 } | |
1398 printf("\n"); | |
1399 } | |
1400 | |
1401 /* ISOC99 _Bool type */ | |
1402 void c99_bool_test(void) | |
1403 { | |
1404 #ifdef BOOL_ISOC99 | |
1405 int a; | |
1406 _Bool b; | |
1407 | |
1408 printf("bool_test:\n"); | |
1409 printf("sizeof(_Bool) = %d\n", sizeof(_Bool)); | |
1410 a = 3; | |
1411 printf("cast: %d %d %d\n", (_Bool)10, (_Bool)0, (_Bool)a); | |
1412 b = 3; | |
1413 printf("b = %d\n", b); | |
1414 b++; | |
1415 printf("b = %d\n", b); | |
1416 #endif | |
1417 } | |
1418 | |
1419 void bitfield_test(void) | |
1420 { | |
1421 int a; | |
1422 struct sbf1 { | |
1423 int f1 : 3; | |
1424 int : 2; | |
1425 int f2 : 1; | |
1426 int : 0; | |
1427 int f3 : 5; | |
1428 int f4 : 7; | |
1429 unsigned int f5 : 7; | |
1430 } st1; | |
1431 printf("bitfield_test:"); | |
1432 printf("sizeof(st1) = %d\n", sizeof(st1)); | |
1433 | |
1434 st1.f1 = 3; | |
1435 st1.f2 = 1; | |
1436 st1.f3 = 15; | |
1437 a = 120; | |
1438 st1.f4 = a; | |
1439 st1.f5 = a; | |
1440 st1.f5++; | |
1441 printf("%d %d %d %d %d\n", | |
1442 st1.f1, st1.f2, st1.f3, st1.f4, st1.f5); | |
320 | 1443 |
1444 st1.f1 = 7; | |
1445 if (st1.f1 == -1) | |
1446 printf("st1.f1 == -1\n"); | |
1447 else | |
1448 printf("st1.f1 != -1\n"); | |
1449 if (st1.f2 == -1) | |
1450 printf("st1.f2 == -1\n"); | |
1451 else | |
1452 printf("st1.f2 != -1\n"); | |
439
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1453 |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1454 /* Do bitfield assignments return correct rvalue? This is bug |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1455 * grischka-2005-09-29 case_3 */ |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1456 { |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1457 struct test1 { unsigned a:1, b:1, c:1, d:1; }; |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1458 struct test1 t1 = {0, 1, 0, 1}; |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1459 struct test1 *p = &t1; |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1460 |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1461 printf("case_3.1: 0101 -> %d%d%d%d\n", p->a, p->b, p->c, p->d); |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1462 p->b = p->d = 0; |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1463 p->a = p->c = 1; |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1464 printf("case_3.2: 1010 -> %d%d%d%d\n", p->a, p->b, p->c, p->d); |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1465 } |
025b81f7e70b
Keep rvalue of bitfield assignment: bit1=bit2=1, grischka-2005-09-25 case_3
Rob Landley <rob@landley.net>
parents:
438
diff
changeset
|
1466 |
70 | 1467 } |
1468 | |
1469 #define FTEST(prefix, type, fmt)\ | |
1470 void prefix ## cmp(type a, type b)\ | |
1471 {\ | |
1472 printf("%d %d %d %d %d %d\n",\ | |
1473 a == b,\ | |
1474 a != b,\ | |
1475 a < b,\ | |
1476 a > b,\ | |
1477 a >= b,\ | |
1478 a <= b);\ | |
1479 printf(fmt " " fmt " " fmt " " fmt " " fmt " " fmt " " fmt "\n",\ | |
1480 a,\ | |
1481 b,\ | |
1482 a + b,\ | |
1483 a - b,\ | |
1484 a * b,\ | |
1485 a / b,\ | |
1486 -a);\ | |
1487 printf(fmt "\n", ++a);\ | |
1488 printf(fmt "\n", a++);\ | |
1489 printf(fmt "\n", a);\ | |
1490 }\ | |
1491 void prefix ## fcast(type a)\ | |
1492 {\ | |
1493 float fa;\ | |
1494 double da;\ | |
1495 long double la;\ | |
1496 int ia;\ | |
1497 unsigned int ua;\ | |
1498 type b;\ | |
1499 fa = a;\ | |
1500 da = a;\ | |
1501 la = a;\ | |
1502 printf("ftof: %f %f %Lf\n", fa, da, la);\ | |
1503 ia = (int)a;\ | |
1504 ua = (unsigned int)a;\ | |
1505 printf("ftoi: %d %u\n", ia, ua);\ | |
1506 ia = -1234;\ | |
1507 ua = 0x81234500;\ | |
1508 b = ia;\ | |
1509 printf("itof: " fmt "\n", b);\ | |
1510 b = ua;\ | |
1511 printf("utof: " fmt "\n", b);\ | |
1512 }\ | |
1513 \ | |
1514 void prefix ## test(void)\ | |
1515 {\ | |
1516 printf("testing '%s'\n", #type);\ | |
1517 prefix ## cmp(1, 2.5);\ | |
1518 prefix ## cmp(2, 1.5);\ | |
1519 prefix ## cmp(1, 1);\ | |
1520 prefix ## fcast(234.6);\ | |
1521 prefix ## fcast(-2334.6);\ | |
1522 } | |
1523 | |
1524 FTEST(f, float, "%f") | |
1525 FTEST(d, double, "%f") | |
1526 FTEST(ld, long double, "%Lf") | |
1527 | |
99 | 1528 double ftab1[3] = { 1.2, 3.4, -5.6 }; |
70 | 1529 |
1530 | |
1531 void float_test(void) | |
1532 { | |
1533 float fa, fb; | |
1534 double da, db; | |
1535 int a; | |
1536 unsigned int b; | |
1537 | |
1538 printf("float_test:\n"); | |
1539 printf("sizeof(float) = %d\n", sizeof(float)); | |
1540 printf("sizeof(double) = %d\n", sizeof(double)); | |
1541 printf("sizeof(long double) = %d\n", sizeof(long double)); | |
1542 ftest(); | |
1543 dtest(); | |
1544 ldtest(); | |
1545 printf("%f %f %f\n", ftab1[0], ftab1[1], ftab1[2]); | |
1546 printf("%f %f %f\n", 2.12, .5, 2.3e10); | |
1547 // printf("%f %f %f\n", 0x1234p12, 0x1e23.23p10, 0x12dp-10); | |
1548 da = 123; | |
1549 printf("da=%f\n", da); | |
1550 fa = 123; | |
1551 printf("fa=%f\n", fa); | |
1552 a = 4000000000; | |
1553 da = a; | |
1554 printf("da = %f\n", da); | |
1555 b = 4000000000; | |
1556 db = b; | |
1557 printf("db = %f\n", db); | |
1558 } | |
1559 | |
1560 int fib(int n) | |
1561 { | |
1562 if (n <= 2) | |
1563 return 1; | |
1564 else | |
1565 return fib(n-1) + fib(n-2); | |
1566 } | |
1567 | |
442
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1568 int reply_self(int x) |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1569 { |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1570 return x; |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1571 } |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1572 |
70 | 1573 void funcptr_test() |
1574 { | |
1575 void (*func)(int); | |
1576 int a; | |
1577 struct { | |
1578 int dummy; | |
1579 void (*func)(int); | |
1580 } st1; | |
1581 | |
1582 printf("funcptr:\n"); | |
1583 func = # | |
1584 (*func)(12345); | |
1585 func = num; | |
1586 a = 1; | |
1587 a = 1; | |
1588 func(12345); | |
1589 /* more complicated pointer computation */ | |
1590 st1.func = num; | |
1591 st1.func(12346); | |
1592 printf("sizeof1 = %d\n", sizeof(funcptr_test)); | |
1593 printf("sizeof2 = %d\n", sizeof funcptr_test); | |
1594 printf("sizeof3 = %d\n", sizeof(&funcptr_test)); | |
1595 printf("sizeof4 = %d\n", sizeof &funcptr_test); | |
442
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1596 |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1597 /* Test function pointer indirection */ |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1598 { |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1599 int (*pfn)(int) = reply_self; |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1600 printf("case_9: 1 (7,8) -> %d (%d,%d)\n", |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1601 (int) (reply_self == *pfn), pfn(7), (******pfn)(8)); |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1602 } |
eff8bc296c57
Fix indirections with function pointers (***fn)() (grischka-2005-09-29 case_9)
Rob Landley <rob@landley.net>
parents:
441
diff
changeset
|
1603 |
70 | 1604 } |
1605 | |
1606 void lloptest(long long a, long long b) | |
1607 { | |
1608 unsigned long long ua, ub; | |
488
2766e2ad73be
Test constant propogation in long long initialization.
Rob Landley <rob@landley.net>
parents:
484
diff
changeset
|
1609 unsigned long long cc=1LL<<48; |
2766e2ad73be
Test constant propogation in long long initialization.
Rob Landley <rob@landley.net>
parents:
484
diff
changeset
|
1610 |
2766e2ad73be
Test constant propogation in long long initialization.
Rob Landley <rob@landley.net>
parents:
484
diff
changeset
|
1611 printf("cc=%Ld\n",cc); |
70 | 1612 |
1613 ua = a; | |
1614 ub = b; | |
1615 /* arith */ | |
207 | 1616 printf("arith: %Ld %Ld %Ld\n", |
70 | 1617 a + b, |
1618 a - b, | |
207 | 1619 a * b); |
1620 | |
1621 if (b != 0) { | |
1622 printf("arith1: %Ld %Ld\n", | |
70 | 1623 a / b, |
1624 a % b); | |
207 | 1625 } |
1626 | |
70 | 1627 /* binary */ |
1628 printf("bin: %Ld %Ld %Ld\n", | |
1629 a & b, | |
1630 a | b, | |
1631 a ^ b); | |
1632 | |
1633 /* tests */ | |
1634 printf("test: %d %d %d %d %d %d\n", | |
1635 a == b, | |
1636 a != b, | |
1637 a < b, | |
1638 a > b, | |
1639 a >= b, | |
1640 a <= b); | |
1641 | |
1642 printf("utest: %d %d %d %d %d %d\n", | |
1643 ua == ub, | |
1644 ua != ub, | |
1645 ua < ub, | |
1646 ua > ub, | |
1647 ua >= ub, | |
1648 ua <= ub); | |
1649 | |
1650 /* arith2 */ | |
1651 a++; | |
1652 b++; | |
1653 printf("arith2: %Ld %Ld\n", a, b); | |
1654 printf("arith2: %Ld %Ld\n", a++, b++); | |
1655 printf("arith2: %Ld %Ld\n", --a, --b); | |
1656 printf("arith2: %Ld %Ld\n", a, b); | |
1657 } | |
1658 | |
1659 void llshift(long long a, int b) | |
1660 { | |
1661 printf("shift: %Ld %Ld %Ld\n", | |
1662 (unsigned long long)a >> b, | |
1663 a >> b, | |
1664 a << b); | |
1665 printf("shiftc: %Ld %Ld %Ld\n", | |
1666 (unsigned long long)a >> 3, | |
1667 a >> 3, | |
1668 a << 3); | |
1669 printf("shiftc: %Ld %Ld %Ld\n", | |
1670 (unsigned long long)a >> 35, | |
1671 a >> 35, | |
1672 a << 35); | |
1673 } | |
1674 | |
1675 void llfloat(void) | |
1676 { | |
1677 float fa; | |
1678 double da; | |
1679 long double lda; | |
1680 long long la, lb, lc; | |
1681 unsigned long long ula, ulb, ulc; | |
1682 la = 0x12345678; | |
1683 ula = 0x72345678; | |
1684 la = (la << 20) | 0x12345; | |
1685 ula = ula << 33; | |
1686 printf("la=%Ld ula=%Lu\n", la, ula); | |
1687 | |
1688 fa = la; | |
1689 da = la; | |
1690 lda = la; | |
1691 printf("lltof: %f %f %Lf\n", fa, da, lda); | |
1692 | |
1693 la = fa; | |
1694 lb = da; | |
1695 lc = lda; | |
1696 printf("ftoll: %Ld %Ld %Ld\n", la, lb, lc); | |
1697 | |
1698 fa = ula; | |
1699 da = ula; | |
1700 lda = ula; | |
1701 printf("ulltof: %f %f %Lf\n", fa, da, lda); | |
1702 | |
1703 ula = fa; | |
1704 ulb = da; | |
1705 ulc = lda; | |
1706 printf("ftoull: %Lu %Lu %Lu\n", ula, ulb, ulc); | |
1707 } | |
1708 | |
1709 long long llfunc1(int a) | |
1710 { | |
176 | 1711 return a * 2; |
70 | 1712 } |
1713 | |
176 | 1714 struct S { |
1715 int id; | |
1716 char item; | |
1717 }; | |
1718 | |
1719 long long int value(struct S *v) | |
1720 { | |
1721 return ((long long int)v->item); | |
1722 } | |
1723 | |
70 | 1724 void longlong_test(void) |
1725 { | |
1726 long long a, b, c; | |
422
dc756f766bfe
From Dave Dodge: When a long long value is used as test expression, for
Rob Landley <rob@landley.net>
parents:
421
diff
changeset
|
1727 unsigned long long ull; |
70 | 1728 int ia; |
1729 unsigned int ua; | |
1730 printf("longlong_test:\n"); | |
1731 printf("sizeof(long long) = %d\n", sizeof(long long)); | |
1732 ia = -1; | |
1733 ua = -2; | |
1734 a = ia; | |
1735 b = ua; | |
1736 printf("%Ld %Ld\n", a, b); | |
1737 printf("%Ld %Ld %Ld %Lx\n", | |
1738 (long long)1, | |
1739 (long long)-2, | |
1740 1LL, | |
1741 0x1234567812345679); | |
1742 a = llfunc1(-3); | |
1743 printf("%Ld\n", a); | |
1744 | |
1745 lloptest(1000, 23); | |
1746 lloptest(0xff, 0x1234); | |
1747 b = 0x72345678 << 10; | |
1748 lloptest(-3, b); | |
1749 llshift(0x123, 5); | |
1750 llshift(-23, 5); | |
176 | 1751 b = 0x72345678LL << 10; |
70 | 1752 llshift(b, 47); |
1753 | |
1754 llfloat(); | |
1755 #if 1 | |
1756 b = 0x12345678; | |
1757 a = -1; | |
1758 c = a + b; | |
1759 printf("%Lx\n", c); | |
1760 #endif | |
176 | 1761 |
1762 /* long long reg spill test */ | |
1763 { | |
1764 struct S a; | |
1765 | |
1766 a.item = 3; | |
1767 printf("%lld\n", value(&a)); | |
1768 } | |
207 | 1769 lloptest(0x80000000, 0); |
326 | 1770 |
1771 /* another long long spill test */ | |
1772 { | |
1773 long long *p, v; | |
1774 v = 1; | |
1775 p = &v; | |
1776 p[0]++; | |
1777 printf("%lld\n", *p); | |
1778 } | |
422
dc756f766bfe
From Dave Dodge: When a long long value is used as test expression, for
Rob Landley <rob@landley.net>
parents:
421
diff
changeset
|
1779 |
dc756f766bfe
From Dave Dodge: When a long long value is used as test expression, for
Rob Landley <rob@landley.net>
parents:
421
diff
changeset
|
1780 /* Make sure long long comparison tests upper 32 bits */ |
dc756f766bfe
From Dave Dodge: When a long long value is used as test expression, for
Rob Landley <rob@landley.net>
parents:
421
diff
changeset
|
1781 ull = 0xffffffff00000000ULL; |
dc756f766bfe
From Dave Dodge: When a long long value is used as test expression, for
Rob Landley <rob@landley.net>
parents:
421
diff
changeset
|
1782 printf("ull=%llx\n",ull); |
dc756f766bfe
From Dave Dodge: When a long long value is used as test expression, for
Rob Landley <rob@landley.net>
parents:
421
diff
changeset
|
1783 printf("ull!=0 ", (ull != 0) ? "true" : "false"); |
dc756f766bfe
From Dave Dodge: When a long long value is used as test expression, for
Rob Landley <rob@landley.net>
parents:
421
diff
changeset
|
1784 printf("ull ", ull ? "true" : "false"); |
441
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1785 |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1786 /* check double -> ull cast */ |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1787 { |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1788 double d = 2.4e18; |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1789 unsigned long long ull = d; |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1790 unsigned long long r = 100000000000LL; |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1791 printf("\ndouble->ull (grischka case 10): %.0f -> %ld\n", |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1792 d/r, (long)(ull/r)); |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1793 } |
6ed28bf1ff35
Fix signedness of LL shift operators in libtcc1.c (grischka-2005-09-25 case_10)
Rob Landley <rob@landley.net>
parents:
440
diff
changeset
|
1794 |
70 | 1795 } |
1796 | |
164 | 1797 void vprintf1(const char *fmt, ...) |
1798 { | |
1799 va_list ap; | |
1800 const char *p; | |
1801 int c, i; | |
1802 double d; | |
1803 long long ll; | |
1804 | |
1805 va_start(ap, fmt); | |
1806 | |
1807 p = fmt; | |
1808 for(;;) { | |
1809 c = *p; | |
1810 if (c == '\0') | |
1811 break; | |
1812 p++; | |
1813 if (c == '%') { | |
1814 c = *p; | |
1815 switch(c) { | |
1816 case '\0': | |
1817 goto the_end; | |
1818 case 'd': | |
1819 i = va_arg(ap, int); | |
1820 printf("%d", i); | |
1821 break; | |
1822 case 'f': | |
1823 d = va_arg(ap, double); | |
1824 printf("%f", d); | |
1825 break; | |
1826 case 'l': | |
1827 ll = va_arg(ap, long long); | |
1828 printf("%Ld", ll); | |
1829 break; | |
1830 } | |
1831 p++; | |
1832 } else { | |
1833 putchar(c); | |
1834 } | |
1835 } | |
1836 the_end: | |
1837 va_end(ap); | |
1838 } | |
1839 | |
1840 | |
1841 void stdarg_test(void) | |
1842 { | |
1843 vprintf1("%d %d %d\n", 1, 2, 3); | |
1844 vprintf1("%f %d %f\n", 1.0, 2, 3.0); | |
1845 vprintf1("%l %l %d %f\n", 1234567891234LL, 987654321986LL, 3, 1234.0); | |
1846 } | |
1847 | |
1848 void whitespace_test(void) | |
1849 { | |
1850 char *str; | |
1851 | |
1852 #if 1 | |
1853 pri\ | |
1854 ntf("whitspace:\n"); | |
1855 #endif | |
1856 pf("N=%d\n", 2); | |
214 | 1857 |
1858 #ifdef CORRECT_CR_HANDLING | |
164 | 1859 pri\ |
1860 ntf("aaa=%d\n", 3); | |
214 | 1861 #endif |
164 | 1862 |
1863 pri\ | |
1864 \ | |
1865 ntf("min=%d\n", 4); | |
333 | 1866 |
1867 #ifdef ACCEPT_CR_IN_STRINGS | |
164 | 1868 printf("len1=%d\n", strlen(" |
1869 ")); | |
214 | 1870 #ifdef CORRECT_CR_HANDLING |
164 | 1871 str = " |
1872 "; | |
1873 printf("len1=%d str[0]=%d\n", strlen(str), str[0]); | |
214 | 1874 #endif |
164 | 1875 printf("len1=%d\n", strlen(" a |
1876 ")); | |
333 | 1877 #endif /* ACCEPT_CR_IN_STRINGS */ |
164 | 1878 } |
1879 | |
1880 int reltab[3] = { 1, 2, 3 }; | |
1881 | |
1882 int *rel1 = &reltab[1]; | |
1883 int *rel2 = &reltab[2]; | |
1884 | |
1885 void relocation_test(void) | |
1886 { | |
1887 printf("*rel1=%d\n", *rel1); | |
1888 printf("*rel2=%d\n", *rel2); | |
1889 } | |
180 | 1890 |
1891 void old_style_f(a,b,c) | |
1892 int a, b; | |
1893 double c; | |
1894 { | |
1895 printf("a=%d b=%d b=%f\n", a, b, c); | |
1896 } | |
1897 | |
234 | 1898 void decl_func1(int cmpfn()) |
1899 { | |
1900 printf("cmpfn=%lx\n", (long)cmpfn); | |
1901 } | |
1902 | |
1903 void decl_func2(cmpfn) | |
1904 int cmpfn(); | |
1905 { | |
1906 printf("cmpfn=%lx\n", (long)cmpfn); | |
1907 } | |
1908 | |
180 | 1909 void old_style_function(void) |
1910 { | |
1911 old_style_f((void *)1, 2, 3.0); | |
234 | 1912 decl_func1(NULL); |
1913 decl_func2(NULL); | |
180 | 1914 } |
1915 | |
1916 void sizeof_test(void) | |
1917 { | |
1918 int a; | |
1919 int **ptr; | |
1920 | |
1921 printf("sizeof(int) = %d\n", sizeof(int)); | |
1922 printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int)); | |
1923 printf("sizeof(short) = %d\n", sizeof(short)); | |
1924 printf("sizeof(unsigned short) = %d\n", sizeof(unsigned short)); | |
1925 printf("sizeof(char) = %d\n", sizeof(char)); | |
1926 printf("sizeof(unsigned char) = %d\n", sizeof(unsigned char)); | |
1927 printf("sizeof(func) = %d\n", sizeof sizeof_test()); | |
1928 a = 1; | |
1929 printf("sizeof(a++) = %d\n", sizeof a++); | |
1930 printf("a=%d\n", a); | |
1931 ptr = NULL; | |
1932 printf("sizeof(**ptr) = %d\n", sizeof (**ptr)); | |
418
60ea6ef39c6f
Add test for -1>sizeof(int) to test suite.
Rob Landley <rob@landley.net>
parents:
406
diff
changeset
|
1933 printf("-1>sizeof(int) = %d\n", -1>sizeof(int)); |
180 | 1934 |
1935 /* some alignof tests */ | |
1936 printf("__alignof__(int) = %d\n", __alignof__(int)); | |
1937 printf("__alignof__(unsigned int) = %d\n", __alignof__(unsigned int)); | |
1938 printf("__alignof__(short) = %d\n", __alignof__(short)); | |
1939 printf("__alignof__(unsigned short) = %d\n", __alignof__(unsigned short)); | |
1940 printf("__alignof__(char) = %d\n", __alignof__(char)); | |
1941 printf("__alignof__(unsigned char) = %d\n", __alignof__(unsigned char)); | |
1942 printf("__alignof__(func) = %d\n", __alignof__ sizeof_test()); | |
1943 } | |
1944 | |
1945 void typeof_test(void) | |
1946 { | |
1947 double a; | |
1948 typeof(a) b; | |
1949 typeof(float) c; | |
1950 | |
1951 a = 1.5; | |
1952 b = 2.5; | |
1953 c = 3.5; | |
1954 printf("a=%f b=%f c=%f\n", a, b, c); | |
1955 } | |
220 | 1956 |
1957 void statement_expr_test(void) | |
1958 { | |
1959 int a, i; | |
1960 | |
1961 a = 0; | |
1962 for(i=0;i<10;i++) { | |
1963 a += 1 + | |
1964 ( { int b, j; | |
1965 b = 0; | |
1966 for(j=0;j<5;j++) | |
1967 b += j; b; | |
1968 } ); | |
1969 } | |
1970 printf("a=%d\n", a); | |
1971 | |
1972 } | |
1973 | |
1974 void local_label_test(void) | |
1975 { | |
1976 int a; | |
1977 goto l1; | |
1978 l2: | |
1979 a = 1 + ({ | |
393 | 1980 __label__ l1, l2, l3, l4; |
1981 goto l1; | |
1982 l4: | |
220 | 1983 printf("aa1\n"); |
393 | 1984 goto l3; |
220 | 1985 l2: |
1986 printf("aa3\n"); | |
393 | 1987 goto l4; |
220 | 1988 l1: |
1989 printf("aa2\n"); | |
1990 goto l2; | |
1991 l3:; | |
1992 1; | |
1993 }); | |
1994 printf("a=%d\n", a); | |
1995 return; | |
393 | 1996 l4: |
220 | 1997 printf("bb1\n"); |
1998 goto l2; | |
393 | 1999 l1: |
220 | 2000 printf("bb2\n"); |
393 | 2001 goto l4; |
220 | 2002 } |
2003 | |
2004 /* inline assembler test */ | |
2005 #ifdef __i386__ | |
2006 | |
2007 /* from linux kernel */ | |
2008 static char * strncat1(char * dest,const char * src,size_t count) | |
2009 { | |
2010 int d0, d1, d2, d3; | |
2011 __asm__ __volatile__( | |
2012 "repne\n\t" | |
2013 "scasb\n\t" | |
2014 "decl %1\n\t" | |
2015 "movl %8,%3\n" | |
2016 "1:\tdecl %3\n\t" | |
2017 "js 2f\n\t" | |
2018 "lodsb\n\t" | |
2019 "stosb\n\t" | |
2020 "testb %%al,%%al\n\t" | |
2021 "jne 1b\n" | |
2022 "2:\txorl %2,%2\n\t" | |
2023 "stosb" | |
2024 : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3) | |
2025 : "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count) | |
2026 : "memory"); | |
2027 return dest; | |
2028 } | |
2029 | |
2030 static inline void * memcpy1(void * to, const void * from, size_t n) | |
2031 { | |
2032 int d0, d1, d2; | |
2033 __asm__ __volatile__( | |
2034 "rep ; movsl\n\t" | |
2035 "testb $2,%b4\n\t" | |
2036 "je 1f\n\t" | |
2037 "movsw\n" | |
2038 "1:\ttestb $1,%b4\n\t" | |
2039 "je 2f\n\t" | |
2040 "movsb\n" | |
2041 "2:" | |
2042 : "=&c" (d0), "=&D" (d1), "=&S" (d2) | |
2043 :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from) | |
2044 : "memory"); | |
2045 return (to); | |
2046 } | |
2047 | |
2048 static __inline__ void sigaddset1(unsigned int *set, int _sig) | |
2049 { | |
2050 __asm__("btsl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc"); | |
2051 } | |
2052 | |
2053 static __inline__ void sigdelset1(unsigned int *set, int _sig) | |
2054 { | |
2055 asm("btrl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc"); | |
2056 } | |
2057 | |
2058 static __inline__ __const__ unsigned int swab32(unsigned int x) | |
2059 { | |
2060 __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ | |
2061 "rorl $16,%0\n\t" /* swap words */ | |
2062 "xchgb %b0,%h0" /* swap higher bytes */ | |
2063 :"=q" (x) | |
2064 : "0" (x)); | |
2065 return x; | |
2066 } | |
2067 | |
245 | 2068 static __inline__ unsigned long long mul64(unsigned int a, unsigned int b) |
2069 { | |
2070 unsigned long long res; | |
2071 __asm__("mull %2" : "=A" (res) : "a" (a), "r" (b)); | |
2072 return res; | |
2073 } | |
2074 | |
2075 static __inline__ unsigned long long inc64(unsigned long long a) | |
2076 { | |
2077 unsigned long long res; | |
2078 __asm__("addl $1, %%eax ; adcl $0, %%edx" : "=A" (res) : "A" (a)); | |
2079 return res; | |
2080 } | |
2081 | |
220 | 2082 unsigned int set; |
2083 | |
475
91c4c7d64f5e
From Joshua Phillips, fix dereferences used in inline assembly output.
Rob Landley <rob@landley.net>
parents:
474
diff
changeset
|
2084 int asm_func(int *x) |
91c4c7d64f5e
From Joshua Phillips, fix dereferences used in inline assembly output.
Rob Landley <rob@landley.net>
parents:
474
diff
changeset
|
2085 { |
91c4c7d64f5e
From Joshua Phillips, fix dereferences used in inline assembly output.
Rob Landley <rob@landley.net>
parents:
474
diff
changeset
|
2086 asm("xorl %0,%0":"=r"(*x)); |
91c4c7d64f5e
From Joshua Phillips, fix dereferences used in inline assembly output.
Rob Landley <rob@landley.net>
parents:
474
diff
changeset
|
2087 return *x; |
91c4c7d64f5e
From Joshua Phillips, fix dereferences used in inline assembly output.
Rob Landley <rob@landley.net>
parents:
474
diff
changeset
|
2088 } |
91c4c7d64f5e
From Joshua Phillips, fix dereferences used in inline assembly output.
Rob Landley <rob@landley.net>
parents:
474
diff
changeset
|
2089 |
220 | 2090 void asm_test(void) |
2091 { | |
2092 char buf[128]; | |
2093 unsigned int val; | |
2094 | |
2095 printf("inline asm:\n"); | |
245 | 2096 /* test the no operand case */ |
2097 asm volatile ("xorl %eax, %eax"); | |
2098 | |
475
91c4c7d64f5e
From Joshua Phillips, fix dereferences used in inline assembly output.
Rob Landley <rob@landley.net>
parents:
474
diff
changeset
|
2099 printf("%d\n",asm_func(&val)); |
91c4c7d64f5e
From Joshua Phillips, fix dereferences used in inline assembly output.
Rob Landley <rob@landley.net>
parents:
474
diff
changeset
|
2100 |
220 | 2101 memcpy1(buf, "hello", 6); |
2102 strncat1(buf, " worldXXXXX", 3); | |
2103 printf("%s\n", buf); | |
2104 | |
245 | 2105 /* 'A' constraint test */ |
2106 printf("mul64=0x%Lx\n", mul64(0x12345678, 0xabcd1234)); | |
2107 printf("inc64=0x%Lx\n", inc64(0x12345678ffffffff)); | |
2108 | |
220 | 2109 set = 0xff; |
2110 sigdelset1(&set, 2); | |
2111 sigaddset1(&set, 16); | |
2112 /* NOTE: we test here if C labels are correctly restored after the | |
2113 asm statement */ | |
2114 goto label1; | |
2115 label2: | |
2116 __asm__("btsl %1,%0" : "=m"(set) : "Ir"(20) : "cc"); | |
2117 printf("set=0x%x\n", set); | |
2118 val = 0x01020304; | |
2119 printf("swab32(0x%08x) = 0x%0x\n", val, swab32(val)); | |
2120 return; | |
2121 label1: | |
2122 goto label2; | |
2123 } | |
2124 | |
2125 #else | |
2126 | |
2127 void asm_test(void) | |
2128 { | |
2129 } | |
2130 | |
2131 #endif | |
256 | 2132 |
2133 #define COMPAT_TYPE(type1, type2) \ | |
2134 {\ | |
2135 printf("__builtin_types_compatible_p(%s, %s) = %d\n", #type1, #type2, \ | |
2136 __builtin_types_compatible_p (type1, type2));\ | |
2137 } | |
2138 | |
2139 int constant_p_var; | |
2140 | |
2141 void builtin_test(void) | |
2142 { | |
2143 #if GCC_MAJOR >= 3 | |
2144 COMPAT_TYPE(int, int); | |
2145 COMPAT_TYPE(int, unsigned int); | |
2146 COMPAT_TYPE(int, char); | |
2147 COMPAT_TYPE(int, const int); | |
2148 COMPAT_TYPE(int, volatile int); | |
2149 COMPAT_TYPE(int *, int *); | |
2150 COMPAT_TYPE(int *, void *); | |
2151 COMPAT_TYPE(int *, const int *); | |
2152 COMPAT_TYPE(char *, unsigned char *); | |
531 | 2153 /* space is needed because tinycc preprocessor introduces a space between each token */ |
256 | 2154 COMPAT_TYPE(char * *, void *); |
2155 #endif | |
2156 printf("res = %d\n", __builtin_constant_p(1)); | |
2157 printf("res = %d\n", __builtin_constant_p(1 + 2)); | |
2158 printf("res = %d\n", __builtin_constant_p(&constant_p_var)); | |
2159 printf("res = %d\n", __builtin_constant_p(constant_p_var)); | |
2160 } | |
279 | 2161 |
2162 | |
435
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2163 /* static_stub1 takes a pointer to a function, and returns a pointer to |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2164 * a function; that function must accept no parameters, and return nothing. */ |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2165 void ((*static_stub1(void ((*p)(void)))) (void)) |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2166 { |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2167 static void (*pfn)(void); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2168 void (*mytemp)(void); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2169 mytemp = pfn; |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2170 pfn = p; |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2171 return mytemp; |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2172 } |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2173 |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2174 /* Another stub. The static "pfn" is in a different function, so it'd better |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2175 not be mapped to the same memory location. */ |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2176 void ((*static_stub2(void ((*p)(void)))) (void)) |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2177 { |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2178 static void (*pfn)(void); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2179 void (*mytemp)(void); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2180 mytemp = pfn; |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2181 pfn = p; |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2182 return mytemp; |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2183 } |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2184 |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2185 |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2186 void static_test(void) |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2187 { |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2188 void (*result)(void); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2189 result = static_stub1(static_test); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2190 printf("static_test Expect 1 -> %d\n", result == 0); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2191 result = static_stub1(static_test); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2192 printf("static_test Expect 1 -> %d\n", result == static_test); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2193 result = static_stub2(static_test); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2194 printf("static_test Expect 1 -> %d\n", result == 0); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2195 result = static_stub2(static_test); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2196 printf("static_test Expect 1 -> %d\n", result == static_test); |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2197 } |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2198 |
f16b04be31b6
Force "static" variables to be in global memory (grischka-2005-09-25 bugfix 5).
Rob Landley <rob@landley.net>
parents:
434
diff
changeset
|
2199 |
279 | 2200 void const_func(const int a) |
2201 { | |
2202 } | |
2203 | |
2204 void const_warn_test(void) | |
2205 { | |
2206 const_func(1); | |
2207 } | |
459
4c3895074170
Add the global compound literals thing to tcctests.c
Rob Landley <rob@landley.net>
parents:
451
diff
changeset
|
2208 |
4c3895074170
Add the global compound literals thing to tcctests.c
Rob Landley <rob@landley.net>
parents:
451
diff
changeset
|
2209 // Make sure compound literals work outside functions. |
4c3895074170
Add the global compound literals thing to tcctests.c
Rob Landley <rob@landley.net>
parents:
451
diff
changeset
|
2210 struct point { int X; int Y; } *test = &((struct point){1,1}); |
472
5ecdf063c480
Joshua Phillips fixed backslash parsing between #ifdefs (\garbage should not
Rob Landley <rob@landley.net>
parents:
459
diff
changeset
|
2211 |
5ecdf063c480
Joshua Phillips fixed backslash parsing between #ifdefs (\garbage should not
Rob Landley <rob@landley.net>
parents:
459
diff
changeset
|
2212 |
5ecdf063c480
Joshua Phillips fixed backslash parsing between #ifdefs (\garbage should not
Rob Landley <rob@landley.net>
parents:
459
diff
changeset
|
2213 // Make sure \garbage isn't an error in #ifdefs. |
5ecdf063c480
Joshua Phillips fixed backslash parsing between #ifdefs (\garbage should not
Rob Landley <rob@landley.net>
parents:
459
diff
changeset
|
2214 #ifdef NOT_DEFINED |
5ecdf063c480
Joshua Phillips fixed backslash parsing between #ifdefs (\garbage should not
Rob Landley <rob@landley.net>
parents:
459
diff
changeset
|
2215 # include <windows.h> |
5ecdf063c480
Joshua Phillips fixed backslash parsing between #ifdefs (\garbage should not
Rob Landley <rob@landley.net>
parents:
459
diff
changeset
|
2216 # include <gl\glaux.h> |
5ecdf063c480
Joshua Phillips fixed backslash parsing between #ifdefs (\garbage should not
Rob Landley <rob@landley.net>
parents:
459
diff
changeset
|
2217 #endif |
482
4bf62ce997e7
Workaround for a bug in glibc where #include <regex.h> misuses restrict.
Rob Landley <rob@landley.net>
parents:
475
diff
changeset
|
2218 |
4bf62ce997e7
Workaround for a bug in glibc where #include <regex.h> misuses restrict.
Rob Landley <rob@landley.net>
parents:
475
diff
changeset
|
2219 // Check workaround for a bug in glibc defining something like |
4bf62ce997e7
Workaround for a bug in glibc where #include <regex.h> misuses restrict.
Rob Landley <rob@landley.net>
parents:
475
diff
changeset
|
2220 // "int blah[restrict];" which isn't legal syntax. |
4bf62ce997e7
Workaround for a bug in glibc where #include <regex.h> misuses restrict.
Rob Landley <rob@landley.net>
parents:
475
diff
changeset
|
2221 #include <regex.h> |
484
90fd46f64079
Handle parentheses within an __attribute__ definition.
Rob Landley <rob@landley.net>
parents:
482
diff
changeset
|
2222 |
90fd46f64079
Handle parentheses within an __attribute__ definition.
Rob Landley <rob@landley.net>
parents:
482
diff
changeset
|
2223 void warn (const char *format, ...) __attribute__((format(printf, (1), (2)))); |