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

Nathan Sidwell <nathan at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |nathan at gcc dot gnu.org

--- Comment #5 from Nathan Sidwell <nathan at gcc dot gnu.org> ---
We're turning 'ab's initializer into a static one (so the lack of a dynamic
initializer is a red herring).  But we're flubbing the form of that initializer
because the placement of AB's bases is not their declaration order.  B is
chosen as the primary base, so AB is laid out as:
AB size 24 align 8
  A @ 16
  B @ 0

The  emitted initializer is:
_ZL2ab:
        .zero   16
        .long   1  <-- A::a
        .quad   _ZTV2AB+16
        .quad   2  <-- B::element

(I modified the testcase so the NSDMIs are distinct non-zero values).  The 16
zero bytes appear to be skipping over the B sub-object to place A's
initializer.

We should be emitting something more like:

_ZL2ab:
        .quad   _ZTV2AB+16
        .quad   2  <--B::element
        .long   1  <-- A::a
        .zero   4  <-- tail padding

Reply via email to