> From: Jason Merrill via Gcc-patches <gcc-patches@gcc.gnu.org>
> Date: Fri, 17 Dec 2021 04:26:55 +0100

> C++14 changed the definition of 'aggregate' to allow default member
> initializers, but such classes still need to be considered "non-POD for the
> purpose of layout" for ABI compatibility with C++11 code.  It seems rare to
> derive from such a class, as evidenced by how long this bug has
> survived (since r216750 in 2014), but it's certainly worth fixing.
> 
> We only warn when we were failing to allocate another field into the
> tail padding of the newly aggregate class; this is the only ABI impact.
> 
> This also changes end_of_class to consider all data members, not just empty
> data members; that used to be an additional flag, removed in r9-5710, but I
> don't see any reason not to always include them.  This makes the result of
> the function correspond to the ABI nvsize term and its nameless counterpart
> that does include virtual bases.
> 
> When looking closely at other users of end_of_class, I realized that we were
> assuming that the latter corresponded to the ABI dsize term, but it doesn't
> if the class ends with an empty virtual base (in the rare case that the
> empty base can't be assigned offset 0), and this matters for layout of
> [[no_unique_address]].  So I added another mode that returns the desired
> value for that case.  I'm not adding a warning for this ABI fix because it's
> a C++20 feature.
> 
> Tested x86_64-pc-linux-gnu, applying to trunk.
> 
>       PR c++/103681
> 
> gcc/ChangeLog:
> 
>       * common.opt (fabi-version): Add v17.
> 
> gcc/cp/ChangeLog:
> 
>       * cp-tree.h (struct lang_type): Add non_pod_aggregate.
>       (CLASSTYPE_NON_POD_AGGREGATE): New.
>       * class.c (check_field_decls): Set it.
>       (check_bases_and_members): Check it.
>       (check_non_pod_aggregate): New.
>       (enum eoc_mode): New.
>       (end_of_class): Always include non-empty fields.
>       Add eoc_nv_or_dsize mode.
>       (include_empty_classes, layout_class_type): Adjust.

Looks like this caused https://gcc.gnu.org/PR104139.

brgds, H-P

Reply via email to