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