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.