GCCs before gcc8 didn't deal with these where constants are required.
Unified · Split
| @@ -480,12 +480,17 @@ int ret(a) · 479 unmodified lines | ||
| 480 | 480 | return 0; |
| 481 | 481 | } |
| 482 | 482 | |
| 483 | +#if !defined(__TINYC__) && (__GNUC__ >= 8) | |
| 484 | +/* Old GCCs don't regard "foo"[1] as constant, even in GNU dialect. */ | |
| 485 | +#define CONSTANTINDEXEDSTRLIT | |
| 486 | +#endif | |
| 483 | 487 | char str_ag1[] = "b"; |
| 484 | 488 | char str_ag2[] = { "b" }; |
| 485 | 489 | /*char str_bg1[] = ("cccc"); GCC accepts this with pedantic warning, TCC not */ |
| 490 | +#ifdef CONSTANTINDEXEDSTRLIT | |
| 486 | 491 | char str_ag3[] = { "ab"[1], 0 }; |
| 487 | −char str_ag4[2] = { "b" }; | |
| 488 | 492 | char str_x[2] = { "xy" "z"[2], 0 }; |
| 493 | +#endif | |
| 489 | 494 | char *str_ar[] = { "one", "two" }; |
| 490 | 495 | struct str_SS {unsigned char a[3], b; }; |
| 491 | 496 | struct str_SS str_sinit15 = { "r" }; |
| @@ -500,12 +505,15 @@ static void string_test2() · 8 unmodified lines | ||
| 500 | 505 | char *pa2 = { "xyz" + 1 }; |
| 501 | 506 | int i = 0; |
| 502 | 507 | struct str_SS ss = { { [0 ... 1] = 'a' }, 0 }; |
| 508 | +#ifndef CONSTANTINDEXEDSTRLIT | |
| 509 | + char str_ag3[] = { "ab"[1], 0 }; | |
| 510 | + char str_x[2] = { "xy" "z"[2], 0 }; | |
| 511 | +#endif | |
| 503 | 512 | puts("string_test2"); |
| 504 | 513 | puts(str_ag1); |
| 505 | 514 | puts(str_ag2); |
| 506 | 515 | /*puts(str_bg1);*/ |
| 507 | 516 | puts(str_ag3); |
| 508 | − puts(str_ag4); | |
| 509 | 517 | puts(str_x); |
| 510 | 518 | puts(str_sinit15.a); |
| 511 | 519 | puts(str_sinit16[0].a); |