[Bug c++/89780] -Wpessimizing-move is too agressive with templates and recommends pessimization
herring at lanl dot gov
gcc-bugzilla@gcc.gnu.org
Thu Aug 11 16:03:54 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89780
--- Comment #7 from S. Davis Herring <herring at lanl dot gov> ---
> In the withMove case, in C++20, we issue:
> warning: moving a local object in a return statement prevents copy elision
> for
> template Dest withMove<Dest>();
> and:
> warning: redundant move in return statement
> for
> template Dest withMove<Source>();
Each of these in isolation is of course correct (which was of course never in
question).
> With my patch, we won't issue any warnings, because I'm not sure if we
> can say that in *any* instantiation of withMove the std::move is
> wrong. Am I mistaken?
P1825R0 makes it much less likely that removing the std::move is ever a
problem. There are cases that still need it, like
struct A {
operator Dest() &&;
};
template Dest withMove<A>();
That said, P2266R3 makes even that case work without std::move in C++23, and
GCC and Clang already accept it without std::move in C++20 mode (even though
it's not listed as a defect report). I think that in these modes it's
impossible to need the std::move, so it's reasonable to issue the warning,
although it might make the most sense to issue a single, generic warning like
"std::move is either useless or harmful here depending on instantiation".
> Thanks for your comments and sorry if I'm still not getting your point.
Thank you for trying to work past my first unclear explanation.
More information about the Gcc-bugs
mailing list