summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/unittests/clangd/SyncAPI.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/clang-tools-extra/unittests/clangd/SyncAPI.cpp b/clang-tools-extra/unittests/clangd/SyncAPI.cpp
index 837a8bdfbd1..9e6ab28c7a7 100644
--- a/clang-tools-extra/unittests/clangd/SyncAPI.cpp
+++ b/clang-tools-extra/unittests/clangd/SyncAPI.cpp
@@ -32,9 +32,11 @@ template <typename T> struct CaptureProxy {
operator UniqueFunction<void(T)>() && {
assert(!Future.valid() && "conversion to callback called multiple times");
Future = Promise.get_future();
- return BindWithForward([](std::promise<T> Promise,
- T Value) { Promise.set_value(std::move(Value)); },
- std::move(Promise));
+ return BindWithForward(
+ [](std::promise<std::shared_ptr<T>> Promise, T Value) {
+ Promise.set_value(std::make_shared<T>(std::move(Value)));
+ },
+ std::move(Promise));
}
~CaptureProxy() {
@@ -42,13 +44,16 @@ template <typename T> struct CaptureProxy {
return;
assert(Future.valid() && "conversion to callback was not called");
assert(!Target->hasValue());
- Target->emplace(Future.get());
+ Target->emplace(std::move(*Future.get()));
}
private:
llvm::Optional<T> *Target;
- std::promise<T> Promise;
- std::future<T> Future;
+ // Using shared_ptr to workaround compilation errors with MSVC.
+ // MSVC only allows default-construcitble and copyable objects as future<>
+ // arguments.
+ std::promise<std::shared_ptr<T>> Promise;
+ std::future<std::shared_ptr<T>> Future;
};
template <typename T> CaptureProxy<T> capture(llvm::Optional<T> &Target) {
OpenPOWER on IntegriCloud