[clang-tools-extra] r325254 - [clangd] Fixed compilation with MVSC.

Ilya Biryukov via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 15 07:41:49 PST 2018


Author: ibiryukov
Date: Thu Feb 15 07:41:49 2018
New Revision: 325254

URL: http://llvm.org/viewvc/llvm-project?rev=325254&view=rev
Log:
[clangd] Fixed compilation with MVSC.

Modified:
    clang-tools-extra/trunk/unittests/clangd/SyncAPI.cpp

Modified: clang-tools-extra/trunk/unittests/clangd/SyncAPI.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/SyncAPI.cpp?rev=325254&r1=325253&r2=325254&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clangd/SyncAPI.cpp (original)
+++ clang-tools-extra/trunk/unittests/clangd/SyncAPI.cpp Thu Feb 15 07:41:49 2018
@@ -32,9 +32,11 @@ template <typename T> struct CaptureProx
   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 CaptureProx
       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) {




More information about the cfe-commits mailing list