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




Reply via email to