diff options
| author | Ilya Biryukov <ibiryukov@google.com> | 2017-08-01 18:27:58 +0000 |
|---|---|---|
| committer | Ilya Biryukov <ibiryukov@google.com> | 2017-08-01 18:27:58 +0000 |
| commit | 6e1f3b1c90a39fd1f681ad418ec80426614c3bd0 (patch) | |
| tree | 0ff61ce774d43f47725ad95c96b741e833fd0b44 | |
| parent | 35dd1ac29cd48358b61a5af975b57a2c7cc8ac6d (diff) | |
| download | bcm5719-llvm-6e1f3b1c90a39fd1f681ad418ec80426614c3bd0.tar.gz bcm5719-llvm-6e1f3b1c90a39fd1f681ad418ec80426614c3bd0.zip | |
[clangd] Fix more MSVC compilation failures.
It turns out MSVC does not allow non-copyable classes in std::future
and std::promise template arguments.
llvm-svn: 309720
| -rw-r--r-- | clang-tools-extra/clangd/ClangdServer.cpp | 4 | ||||
| -rw-r--r-- | clang-tools-extra/clangd/ClangdUnit.cpp | 12 | ||||
| -rw-r--r-- | clang-tools-extra/clangd/ClangdUnit.h | 15 |
3 files changed, 16 insertions, 15 deletions
diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp index c15d5544dcd..eb4995be0cd 100644 --- a/clang-tools-extra/clangd/ClangdServer.cpp +++ b/clang-tools-extra/clangd/ClangdServer.cpp @@ -275,7 +275,7 @@ std::string ClangdServer::dumpAST(PathRef File) { assert(Resources && "dumpAST is called for non-added document"); std::string Result; - Resources->getAST().get().runUnderLock([&Result](ParsedAST *AST) { + Resources->getAST().get()->runUnderLock([&Result](ParsedAST *AST) { llvm::raw_string_ostream ResultOS(Result); if (AST) { clangd::dumpAST(*AST, ResultOS); @@ -299,7 +299,7 @@ Tagged<std::vector<Location>> ClangdServer::findDefinitions(PathRef File, assert(Resources && "Calling findDefinitions on non-added file"); std::vector<Location> Result; - Resources->getAST().get().runUnderLock([Pos, &Result](ParsedAST *AST) { + Resources->getAST().get()->runUnderLock([Pos, &Result](ParsedAST *AST) { if (!AST) return; Result = clangd::findDefinitions(*AST, Pos); diff --git a/clang-tools-extra/clangd/ClangdUnit.cpp b/clang-tools-extra/clangd/ClangdUnit.cpp index 3869a595f91..5c9c5cd25da 100644 --- a/clang-tools-extra/clangd/ClangdUnit.cpp +++ b/clang-tools-extra/clangd/ClangdUnit.cpp @@ -707,7 +707,7 @@ CppFile::CppFile(PathRef FileName, tooling::CompileCommand Command, PreamblePromise.set_value(nullptr); PreambleFuture = PreamblePromise.get_future(); - ASTPromise.set_value(ParsedASTWrapper(llvm::None)); + ASTPromise.set_value(std::make_shared<ParsedASTWrapper>(llvm::None)); ASTFuture = ASTPromise.get_future(); } @@ -722,7 +722,7 @@ void CppFile::cancelRebuilds() { PreambleFuture = PreamblePromise.get_future(); } if (futureIsReady(ASTFuture)) { - ASTPromise = std::promise<ParsedASTWrapper>(); + ASTPromise = std::promise<std::shared_ptr<ParsedASTWrapper>>(); ASTFuture = ASTPromise.get_future(); } // Now wait for rebuild to finish. @@ -730,7 +730,7 @@ void CppFile::cancelRebuilds() { // Return empty results for futures. PreamblePromise.set_value(nullptr); - ASTPromise.set_value(ParsedASTWrapper(llvm::None)); + ASTPromise.set_value(std::make_shared<ParsedASTWrapper>(llvm::None)); } llvm::Optional<std::vector<DiagWithFixIts>> @@ -763,7 +763,7 @@ CppFile::deferRebuild(StringRef NewContents, this->PreambleFuture = this->PreamblePromise.get_future(); } if (futureIsReady(this->ASTFuture)) { - this->ASTPromise = std::promise<ParsedASTWrapper>(); + this->ASTPromise = std::promise<std::shared_ptr<ParsedASTWrapper>>(); this->ASTFuture = this->ASTPromise.get_future(); } } // unlock Mutex. @@ -878,7 +878,7 @@ CppFile::deferRebuild(StringRef NewContents, return Diagnostics; // Our rebuild request was cancelled, don't set // ASTPromise. - That->ASTPromise.set_value(ParsedASTWrapper(std::move(NewAST))); + That->ASTPromise.set_value(std::make_shared<ParsedASTWrapper>(std::move(NewAST))); } // unlock Mutex return Diagnostics; @@ -898,7 +898,7 @@ std::shared_ptr<const PreambleData> CppFile::getPossiblyStalePreamble() const { return LatestAvailablePreamble; } -std::shared_future<ParsedASTWrapper> CppFile::getAST() const { +std::shared_future<std::shared_ptr<ParsedASTWrapper>> CppFile::getAST() const { std::lock_guard<std::mutex> Lock(Mutex); return ASTFuture; } diff --git a/clang-tools-extra/clangd/ClangdUnit.h b/clang-tools-extra/clangd/ClangdUnit.h index 5906aea3ad0..8d7639e0594 100644 --- a/clang-tools-extra/clangd/ClangdUnit.h +++ b/clang-tools-extra/clangd/ClangdUnit.h @@ -104,10 +104,6 @@ private: // Provides thread-safe access to ParsedAST. class ParsedASTWrapper { public: - // MSVC does not allow to use types without default constructor in - // std::promise<> template arguments. - ParsedASTWrapper() = default; - ParsedASTWrapper(ParsedASTWrapper &&Wrapper); ParsedASTWrapper(llvm::Optional<ParsedAST> AST); @@ -192,7 +188,10 @@ public: /// Returns a future to get the most fresh AST for a file. Returned AST is /// wrapped to prevent concurrent accesses. - std::shared_future<ParsedASTWrapper> getAST() const; + /// We use std::shared_ptr here because MVSC fails to compile non-copyable + /// classes as template arguments of promise/future. It is guaranteed to + /// always be non-null. + std::shared_future<std::shared_ptr<ParsedASTWrapper>> getAST() const; /// Get CompileCommand used to build this CppFile. tooling::CompileCommand const &getCompileCommand() const; @@ -226,8 +225,10 @@ private: std::condition_variable RebuildCond; /// Promise and future for the latests AST. Fulfilled during rebuild. - std::promise<ParsedASTWrapper> ASTPromise; - std::shared_future<ParsedASTWrapper> ASTFuture; + /// We use std::shared_ptr here because MVSC fails to compile non-copyable + /// classes as template arguments of promise/future. + std::promise<std::shared_ptr<ParsedASTWrapper>> ASTPromise; + std::shared_future<std::shared_ptr<ParsedASTWrapper>> ASTFuture; /// Promise and future for the latests Preamble. Fulfilled during rebuild. std::promise<std::shared_ptr<const PreambleData>> PreamblePromise; |

