The implementation of return value optimization in D51741 turns
co_return value;
which is essentially
__promise.return_value(value);
into
__promise.return_value(decltype<value>(std::move(value)));
instead of
__promise.return_value(std::move(value));
Instead of doing a copy/move initialization, which is only required for
regular return statements, we just cast to an xvalue reference when we
can consume an object.
Also simplifies the test: some flags aren't needed, neither is main.
Instead we now check that no move constructor is emitted in certain
cases. (That is, we actually delete the move constructor.)
Overlad resolution can actually still fail if there is a viable candidate, namely when there are multiple candidates and none is better than all others. It's a bit weird though to fall back to lvalue parameter then as if nothing happened.