No, you should only require a move constructor in this situation. Either your code has a bug (perhaps the move constructor was suppressed, or you didn't actually add it) or it's a GCC bug. It looks like based on your post edit, it was probably the former.
A copy constructor would be needed if you tried to return an L-value other than a local variable. In that situation, you can turn an L-value into an R-value using move()
to get it to work (realizing that you will then probably be changing the state of the L-value, of course).