diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/RPCUtils.h @@ -243,6 +243,8 @@ static void consumeAbandoned(ErrorReturnType RetOrErr) { consumeError(RetOrErr.takeError()); } + + static ErrorReturnType returnError(Error Err) { return std::move(Err); } }; // ResultTraits specialization for void functions. @@ -275,6 +277,8 @@ static void consumeAbandoned(ErrorReturnType Err) { consumeError(std::move(Err)); } + + static ErrorReturnType returnError(Error Err) { return Err; } }; // ResultTraits is equivalent to ResultTraits. This allows @@ -1494,36 +1498,34 @@ typename detail::ResultTraits::ErrorReturnType callB(const ArgTs &...Args) { bool ReceivedResponse = false; - using ResultType = typename detail::ResultTraits::ErrorReturnType; - auto Result = detail::ResultTraits::createBlankErrorReturnValue(); + using AltRetTraits = detail::ResultTraits; + using ResultType = typename AltRetTraits::ErrorReturnType; + ResultType Result = AltRetTraits::createBlankErrorReturnValue(); // We have to 'Check' result (which we know is in a success state at this // point) so that it can be overwritten in the async handler. (void)!!Result; - if (auto Err = this->template appendCallAsync( + if (Error Err = this->template appendCallAsync( [&](ResultType R) { Result = std::move(R); ReceivedResponse = true; return Error::success(); }, Args...)) { - detail::ResultTraits::consumeAbandoned( - std::move(Result)); - return std::move(Err); + AltRetTraits::consumeAbandoned(std::move(Result)); + return AltRetTraits::returnError(std::move(Err)); } - if (auto Err = this->C.send()) { - detail::ResultTraits::consumeAbandoned( - std::move(Result)); - return std::move(Err); + if (Error Err = this->C.send()) { + AltRetTraits::consumeAbandoned(std::move(Result)); + return AltRetTraits::returnError(std::move(Err)); } while (!ReceivedResponse) { - if (auto Err = this->handleOne()) { - detail::ResultTraits::consumeAbandoned( - std::move(Result)); - return std::move(Err); + if (Error Err = this->handleOne()) { + AltRetTraits::consumeAbandoned(std::move(Result)); + return AltRetTraits::returnError(std::move(Err)); } }