RetT RetVal = detail::ResultDeserializer<SPSRetTagT, RetT>::makeValue();
detail::ResultDeserializer<SPSRetTagT, RetT>::makeSafe(RetVal);
+ if (auto *ErrMsg = R.getOutOfBandError()) {
+ SDR(make_error<StringError>(ErrMsg, inconvertibleErrorCode()),
+ std::move(RetVal));
+ return;
+ }
+
SPSInputBuffer IB(R.data(), R.size());
if (auto Err = detail::ResultDeserializer<SPSRetTagT, RetT>::deserialize(
RetVal, R.data(), R.size()))
#include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h"
#include "llvm/ADT/FunctionExtras.h"
+#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
#include <future>
addAsyncWrapper, Result, 1, 2));
EXPECT_EQ(Result, (int32_t)3);
}
+
+static WrapperFunctionResult failingWrapper(const char *ArgData,
+ size_t ArgSize) {
+ return WrapperFunctionResult::createOutOfBandError("failed");
+}
+
+void asyncFailingWrapperCaller(unique_function<void(WrapperFunctionResult)> F,
+ const char *ArgData, size_t ArgSize) {
+ F(failingWrapper(ArgData, ArgSize));
+}
+
+TEST(WrapperFunctionUtilsTest, WrapperFunctionCallFailingAsync) {
+ WrapperFunction<void()>::callAsync(asyncFailingWrapperCaller, [](Error Err) {
+ EXPECT_THAT_ERROR(std::move(Err), Failed());
+ });
+}