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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

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

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Of course we could also try to get smarter at gimplification time.
We have
{._storage={.D.9582={.D.9163={._tail={.D.9221={._tail={.D.9280={._head={}}}}}}},
._which=2}}
ctor and the only CONSTRUCTOR_ZERO_PADDING_BITS ctor is that {}, for 1-byte
empty structure, while the whole structure has 48 bytes, so we could also
gimplify it as
  D.10137._storage..D.9582.D.9163._tail.D.9221._tail.D.9280._head = {};
  D.10137._storage._which = 2;
rather than
  D.10137 = {};
  D.10137._storage._which = 2;
But we'd need to figure out not just that there is padding, but also how much
padding we need to clear, how consecutive or non-consecutive it is, etc.
Maybe as a hack just let the code handle one special case, if there is just one
sub-field which needs zero padding, only zero initialize that, if there are 2+,
zero it all.

Changing
-    return ref_proxy<option_2, option_ref >(option_2());
+    return ref_proxy<option_2, option_ref >(option_2{});
in the testcase also achieves the same effect.

Reply via email to