https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68613

            Bug ID: 68613
           Summary: initializer-string for array of chars is too long
                    error on flexible array member
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

G++ (but not gcc) rejects the following valid program that relies on the GCC
extension to statically initialize a struct object with a flexible array
member.  Since flexible array members are accepted in C++ mode for
compatibility with C and with GCC, and since GCC accepts such initialization
(warning only with -Wpedantic), it seems that the program below should be
accepted by g++ even without -fpermissive (and be diagnosed with -Wpedantic).

$ cat t.cpp && /build/gcc-trunk-svn/gcc/xg++ -B /build/gcc-trunk-svn/gcc -S
-Wall -Wextra -Wpedantic t.cpp
struct A {
    int n;
    char a[];
};

#define A(str) sizeof str, str

struct A a = { A ("abc") };
t.cpp:3:12: warning: ISO C++ forbids zero-size array ‘a’ [-Wpedantic]
     char a[];
            ^

t.cpp:8:26: error: initializer-string for array of chars is too long
[-fpermissive]
 struct A a = { A ("abc") };
                          ^

In C mode:
$ /build/gcc-trunk-svn/gcc/xgcc -B /build/gcc-trunk-svn/gcc -S -Wall -Wextra
-Wpedantic -xc t.cpp
t.cpp:8:19: warning: initialization of a flexible array member [-Wpedantic]
 struct A a = { A ("abc") };
                   ^

t.cpp:6:28: note: in definition of macro ‘A’
 #define A(str) sizeof str, str
                            ^~~

t.cpp:8:19: note: (near initialization for ‘a.a’)
 struct A a = { A ("abc") };
                   ^

t.cpp:6:28: note: in definition of macro ‘A’
 #define A(str) sizeof str, str
                            ^~~

Reply via email to