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

Bernd Edlinger <edlinger at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|diagnostic, rejects-valid   |wrong-code

--- Comment #3 from Bernd Edlinger <edlinger at gcc dot gnu.org> ---
This is half fixed by r267653

B was already correctly rejected, and is invalid in C++11:

$ cat x.cc 
struct A { int n, a[]; };

struct B
{
  int n = 3;
  int a1[] = { 2, 1, 0 };      // rejected (see pr72775)
} b;

struct C
{
  A a2 = { 3, { 2, 1, 0 } };   // accepted
} c;

struct E
{
  A a4;

  E ():
    a4 {3, { 2, 1, 0 } } { }   // accepted
} e;
$ g++ x.cc
x.cc:6:7: error: initializer for flexible array member 'int B::a1 []'
    6 |   int a1[] = { 2, 1, 0 };      // rejected (see pr72775)
      |       ^~
x.cc:11:27: error: non-static initialization of a flexible array member
   11 |   A a2 = { 3, { 2, 1, 0 } };   // accepted
      |                           ^
x.cc: In constructor 'E::E()':
x.cc:19:24: error: non-static initialization of a flexible array member
   19 |     a4 {3, { 2, 1, 0 } } { }   // accepted
      |                        ^

C and E are diagnosed as non-static initialization which is fine.

But D is still accepted:

$ cat t.cc 
struct A { int n, a[]; };

struct D
{
  int n, a3[];

  D ():
    n (3),
    a3 {2, 1, 0} { }           // silently accepted
} d;

D* foo ()
{
  return new D; 
}

void bar ()
{
  volatile D vd;
}
$ g++ -S -O3 t.cc
$ cat t.s
        .file   "t.cc"
        .text
        .p2align 4
        .globl  _Z3foov
        .type   _Z3foov, @function
_Z3foov:
.LFB3:
        .cfi_startproc
        subq    $8, %rsp
        .cfi_def_cfa_offset 16
        movl    $4, %edi                <<<--- allocate only 4 byte, 16 neeeded
        call    _Znwm
        movdqa  .LC0(%rip), %xmm0
        movups  %xmm0, (%rax)
        addq    $8, %rsp
        .cfi_def_cfa_offset 8
        ret
        .cfi_endproc
.LFE3:
        .size   _Z3foov, .-_Z3foov
        .p2align 4
        .globl  _Z3barv
        .type   _Z3barv, @function
_Z3barv:
.LFB4:
        .cfi_startproc                  <<<--- didn't I declare vd as volatile?
        ret
        .cfi_endproc
.LFE4:
        .size   _Z3barv, .-_Z3barv
        .section        .text.startup,"ax",@progbits
        .p2align 4
        .type   _GLOBAL__sub_I_d, @function
_GLOBAL__sub_I_d:
.LFB6:
        .cfi_startproc
        movdqa  .LC0(%rip), %xmm0
        movaps  %xmm0, d(%rip)
        ret
        .cfi_endproc
.LFE6:
        .size   _GLOBAL__sub_I_d, .-_GLOBAL__sub_I_d
        .section        .init_array,"aw"
        .align 8
        .quad   _GLOBAL__sub_I_d
        .globl  d
        .bss
        .align 16
        .type   d, @object
        .size   d, 4
d:
        .zero   4                <<<--- object has only 4 bytes, 16 needed
        .section        .rodata.cst16,"aM",@progbits,16
        .align 16
.LC0:
        .long   3
        .long   2
        .long   1
        .long   0
        .ident  "GCC: (GNU) 9.0.0 20190104 (experimental)"
        .section        .note.GNU-stack,"",@progbits

Reply via email to