Author: ibiryukov Date: Wed Jan 31 03:26:43 2018 New Revision: 323863 URL: http://llvm.org/viewvc/llvm-project?rev=323863&view=rev Log: [clangd] Second attempt to fix MSVC compilation breakage.
Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=323863&r1=323862&r2=323863&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original) +++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Wed Jan 31 03:26:43 2018 @@ -34,25 +34,31 @@ namespace { // Issues an async read of AST and waits for results. template <class Ret, class Func> Ret blockingRunWithAST(TUScheduler &S, PathRef File, Func &&F) { - // Using Optional to workaround MSVC bug. It requires future<> arguments to - // have default ctor. - std::packaged_task<llvm::Optional<Ret>(llvm::Expected<InputsAndAST>)> Task( - std::forward<Func>(F)); + // Using shared_ptr to workaround MSVC bug. It requires future<> arguments to + // have default and copy ctor. + auto SharedPtrFunc = [&](llvm::Expected<InputsAndAST> Arg) { + return std::make_shared<Ret>(F(std::move(Arg))); + }; + std::packaged_task<std::shared_ptr<Ret>(llvm::Expected<InputsAndAST>)> Task( + SharedPtrFunc); auto Future = Task.get_future(); S.runWithAST(File, std::move(Task)); - return *Future.get(); + return std::move(*Future.get()); } // Issues an async read of preamble and waits for results. template <class Ret, class Func> Ret blockingRunWithPreamble(TUScheduler &S, PathRef File, Func &&F) { - // Using Optional to workaround MSVC bug. It requires future<> arguments to - // have default ctor. - std::packaged_task<llvm::Optional<Ret>(llvm::Expected<InputsAndPreamble>)> - Task(std::forward<Func>(F)); + // Using shared_ptr to workaround MSVC bug. It requires future<> arguments to + // have default and copy ctor. + auto SharedPtrFunc = [&](llvm::Expected<InputsAndPreamble> Arg) { + return std::make_shared<Ret>(F(std::move(Arg))); + }; + std::packaged_task<std::shared_ptr<Ret>(llvm::Expected<InputsAndPreamble>)> + Task(SharedPtrFunc); auto Future = Task.get_future(); S.runWithPreamble(File, std::move(Task)); - return *Future.get(); + return std::move(*Future.get()); } void ignoreError(llvm::Error Err) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits