https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118763
--- Comment #5 from Valentin Tolmer <valentin at tolmer dot fr> --- Note that there's the same issue with calling a class initializer with multiple arguments (but not a function or a constructor). Refactored example to remove ASAN: ``` #include <iostream> struct s { char c_; s(char c) : c_(c) {std::cout << "constructed s " << c << "\n";} ~s(){std::cout << "destructed s " << c_ << "\n";} }; struct a { s b{'b'}; s c{'c'}; //a(s d, s e) : b(d), c(e){} //a() = default; }; a fn(){ return a{ s{'x'}, ({ return a{}; s{'y'}; }) }; } int main(){ fn(); } ``` prints: constructed s x constructed s b constructed s c destructed s c destructed s b The temporary s x is never destructed. Uncommenting the constructors removes the temporary altogether. This one reproduces as far back as it will compile (so, gcc 6.1).