On AIX 7.1, with xlc as compiler, there is a build failure: $ xlc -q64 -qthreaded -qtls -I. -I.. -I./lib -Ilib -I../lib -Isrc -I../src -I/home/haible/prefix64/include -D_THREAD_SAFE -g -c -o src/ls.o ../src/ls.c "../src/ls.c", line 636.27: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 636.34: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 637.27: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 639.27: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 643.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 643.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 643.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 643.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 643.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 645.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 645.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 645.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 645.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 645.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 646.27: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 646.31: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 648.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 648.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 648.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 648.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 648.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 650.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 650.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 650.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 650.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 650.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 652.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 652.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 652.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 652.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 652.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 656.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 656.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 656.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 656.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 656.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 658.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 658.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 658.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 658.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 658.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 660.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 660.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 660.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 660.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 660.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 662.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 662.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 662.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 662.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 662.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 664.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 664.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 664.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 664.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 664.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 666.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 666.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 666.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 666.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 666.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 668.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 668.16: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 668.20: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 668.24: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 668.28: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 672.12: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "../src/ls.c", line 672.19: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "../src/ls.c", line 672.23: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members.
The problem can be reproduced with this snippet: ============================= foo.c ========================= #include <stddef.h> struct bin_str { size_t len; /* Number of bytes */ char const *string; /* Pointer to the same */ }; struct bin_str color_indicator[] = { { 2, (char const []) {'\033','['} },/* lc: Left of color sequence */ { 1, (char const []) {'m'} }, /* rc: Right of color sequence */ { 0, NULL } /* ec: End color (replaces lc+rs+rc) */ }; ============================================================= $ xlc -S foo.c "foo.c", line 9.27: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. "foo.c", line 9.34: 1506-026 (S) Number of initializers cannot be greater than the number of aggregate members. "foo.c", line 10.27: 1506-196 (W) Initialization between types "const char*" and "int" is not allowed. No -langlvl=... option helps. It does not seem to be a question of C99 vs. C11, since gcc supports this source file even with -std=c89. Rather, it appears to be a specific xlc bug. I propose to ignore it, because - AIX 7.1 is end-of-life since 2023-07-28, - Newer AIX releases come with newer compilers. Bruno