https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95384
--- Comment #2 from Marc Glisse <glisse at gcc dot gnu.org> --- Or with less templates: struct A { A() = default; union S { constexpr S() noexcept : e() { } struct {} e; int i; } s; bool b = false; }; struct B : A { B() = default; using A::A; }; B f() { return {}; } movl $0, -12(%rsp) movq -16(%rsp), %rax ret instead of a plain xorl %eax, %eax optimized dump is MEM <char[4]> [(struct B *)&D.2265 + 4B] = {}; MEM[(union S *)&D.2265] ={v} {CLOBBER}; D.2275 = D.2265; D.2265 ={v} {CLOBBER}; return D.2275; expand (insn 5 2 6 2 (set (mem/c:SI (plus:DI (reg/f:DI 77 virtual-stack-vars) (const_int -12 [0xfffffffffffffff4])) [7 MEM <char[4]> [(struct B *)&D.2265 + 4B]+0 S4 A32]) (const_int 0 [0])) "o.cc":14:17 -1 (nil)) (insn 6 5 7 2 (set (reg:DI 83) (mem/c:DI (plus:DI (reg/f:DI 77 virtual-stack-vars) (const_int -16 [0xfffffffffffffff0])) [7 D.2265+0 S8 A64])) "o.cc":14:17 -1 (nil)) (insn 7 6 8 2 (set (mem/c:DI (plus:DI (reg/f:DI 77 virtual-stack-vars) (const_int -8 [0xfffffffffffffff8])) [7 D.2275+0 S8 A64]) (reg:DI 83)) "o.cc":14:17 -1 (nil)) (insn 8 7 9 2 (set (reg:DI 84) (const_int 0 [0])) "o.cc":14:17 -1 (nil)) (insn 9 8 10 2 (set (reg:DI 84) (mem/c:DI (plus:DI (reg/f:DI 77 virtual-stack-vars) (const_int -8 [0xfffffffffffffff8])) [7 D.2275+0 S8 A64])) "o.cc":14:17 -1 (nil)) (insn 10 9 11 2 (set (reg:DI 85) (reg:DI 84)) "o.cc":14:17 -1 (nil)) (insn 11 10 15 2 (set (reg:DI 82 [ <retval> ]) (reg:DI 85)) "o.cc":14:17 -1 (nil)) (insn 15 11 16 2 (set (reg/i:DI 0 ax) (reg:DI 82 [ <retval> ])) "o.cc":14:20 -1 (nil)) (insn 16 15 0 2 (use (reg/i:DI 0 ax)) "o.cc":14:20 -1 (nil)) and dfinish (insn:TI 5 2 15 2 (set (mem/c:SI (plus:DI (reg/f:DI 7 sp) (const_int -12 [0xfffffffffffffff4])) [7 MEM <char[4]> [(struct B *)&D.2265 + 4B]+0 S4 A32]) (const_int 0 [0])) "o.cc":14:17 67 {*movsi_internal} (nil)) (insn 15 5 16 2 (set (reg/i:DI 0 ax) (mem/c:DI (plus:DI (reg/f:DI 7 sp) (const_int -16 [0xfffffffffffffff0])) [7 D.2265+0 S8 A64])) "o.cc":14:20 66 {*movdi_internal} (nil)) (insn 16 15 25 2 (use (reg/i:DI 0 ax)) "o.cc":14:20 -1 (nil))