[Bug c++/86173] New: Default construction of a union (in std::optional)
glisse at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sat Jun 16 09:59:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86173
Bug ID: 86173
Summary: Default construction of a union (in std::optional)
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: glisse at gcc dot gnu.org
Target Milestone: ---
Default construction of std::optional<A> always starts with a memset of the
whole optional to 0, while it doesn't with clang using the same libstdc++.
#include <optional>
struct AA {
double a[1024];
#ifndef TRIVIAL
AA(); AA(AA const&); AA& operator=(AA const&); ~AA();
#endif
};
typedef std::optional<AA> O;
// O fff(){ return {}; }
O fff(){ O o; return o; }
The .original dump has
*<retval> = {.D.34926={._M_payload={.D.34026={._M_empty={}}, ._M_engaged=0}}}
which looks good, it says it is initializing the small _M_empty part of the
union, but the gimple dump has
*<retval> = {};
which eagerly zeroes everything.
More information about the Gcc-bugs
mailing list