summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Biryukov <ibiryukov@google.com>2017-08-01 18:27:58 +0000
committerIlya Biryukov <ibiryukov@google.com>2017-08-01 18:27:58 +0000
commit6e1f3b1c90a39fd1f681ad418ec80426614c3bd0 (patch)
tree0ff61ce774d43f47725ad95c96b741e833fd0b44
parent35dd1ac29cd48358b61a5af975b57a2c7cc8ac6d (diff)
downloadbcm5719-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.cpp4
-rw-r--r--clang-tools-extra/clangd/ClangdUnit.cpp12
-rw-r--r--clang-tools-extra/clangd/ClangdUnit.h15
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;
OpenPOWER on IntegriCloud