https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89976
--- Comment #2 from Nikita Kniazev <nok.raven at gmail dot com> --- The same warning as when the object is constructed inside the main function: int main() { XorYorZ x; return x.x; } Also, the warning is not triggered in C++17+ mode with: XorYorZ foo() { return XorYorZ(); } where the guaranteed return value optimization have to happen and the code must have the same meaning as: int main() { XorYorZ x = XorYorZ(); return x.x; } which triggers the warning, and is the same as just `XorYorZ x;` because of the presence of the user defined constructor in X/Y/Z and copy/move elision.