[clang-tools-extra] r309720 - [clangd] Fix more MSVC compilation failures.

Ilya Biryukov via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 1 11:27:58 PDT 2017


Author: ibiryukov
Date: Tue Aug  1 11:27:58 2017
New Revision: 309720

URL: http://llvm.org/viewvc/llvm-project?rev=309720&view=rev
Log:
[clangd] Fix more MSVC compilation failures.

It turns out MSVC does not allow non-copyable classes in std::future
and std::promise template arguments.

Modified:
    clang-tools-extra/trunk/clangd/ClangdServer.cpp
    clang-tools-extra/trunk/clangd/ClangdUnit.cpp
    clang-tools-extra/trunk/clangd/ClangdUnit.h

Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=309720&r1=309719&r2=309720&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original)
+++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Tue Aug  1 11:27:58 2017
@@ -275,7 +275,7 @@ std::string ClangdServer::dumpAST(PathRe
   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>> ClangdServ
   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);

Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.cpp?rev=309720&r1=309719&r2=309720&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ClangdUnit.cpp (original)
+++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp Tue Aug  1 11:27:58 2017
@@ -707,7 +707,7 @@ CppFile::CppFile(PathRef FileName, tooli
   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 NewConte
       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 NewConte
         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> CppF
   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;
 }

Modified: clang-tools-extra/trunk/clangd/ClangdUnit.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.h?rev=309720&r1=309719&r2=309720&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ClangdUnit.h (original)
+++ clang-tools-extra/trunk/clangd/ClangdUnit.h Tue Aug  1 11:27:58 2017
@@ -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;




More information about the cfe-commits mailing list