[Bug c++/86173] Default construction of a union (in std::optional)
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Jun 18 07:39:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86173
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2018-06-18
CC| |ebotcazou at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
This is because of gimplification interpreting a CONSTURCTOR with missing
elements as to clear them unless CONSTRUCTOR_NO_CLEARING is set (which isn't).
So the GENERIC _doesn't_ look good since it says (implicitely) that 'a' is
zeroed.
Confirmed as C++ issue.
There's also the following weak heuristic that might kick in if
CONSTRUCTOR_NO_CLEARING would be set:
else if (num_ctor_elements - num_nonzero_elements
> CLEAR_RATIO (optimize_function_for_speed_p (cfun))
&& num_nonzero_elements < num_ctor_elements / 4)
/* If there are "lots" of zeros, it's more efficient to clear
the memory and then set the nonzero elements. */
cleared = true;
with CONSTRUCTOR_NO_CLEARING this heuristic is off by not honoring
the constructor elements being not present (but for the testcase it
doesn't matter). CCing Eric for this specific issue (not the C++ one).
More information about the Gcc-bugs
mailing list