https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95405
--- Comment #3 from Marc Glisse <glisse at gcc dot gnu.org> --- For a self-contained version, see below. Notice how the extra constructor in _Optional_payload_base changes the generated code, or storing directly a _Optional_payload_base instead of _Optional_payload in optional struct _Optional_payload_base { long _M_value; bool _M_engaged = false; _Optional_payload_base() = default; ~_Optional_payload_base() = default; _Optional_payload_base(const _Optional_payload_base&) = default; _Optional_payload_base(_Optional_payload_base&&) = default; _Optional_payload_base(double,float); }; struct _Optional_payload : _Optional_payload_base { }; struct optional { _Optional_payload _M_payload; }; optional foo(); long bar() { auto r = foo(); if (r._M_payload._M_engaged) return r._M_payload._M_value; else return 0L; }