]> granicus.if.org Git - clang/commitdiff
Use a std::unique_ptr to make it easier to see who owns the stream.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 10 Apr 2015 14:11:52 +0000 (14:11 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 10 Apr 2015 14:11:52 +0000 (14:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234597 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/CompilerInstance.h
lib/Frontend/CompilerInstance.cpp

index ed013290e8bd0709b95ea976225180a9c80943e5..94966e1a5ede785ace28db95518a4c6b74d7c552 100644 (file)
@@ -151,11 +151,11 @@ class CompilerInstance : public ModuleLoader {
   struct OutputFile {
     std::string Filename;
     std::string TempFilename;
-    raw_ostream *OS;
+    std::unique_ptr<raw_ostream> OS;
 
     OutputFile(const std::string &filename, const std::string &tempFilename,
-               raw_ostream *os)
-      : Filename(filename), TempFilename(tempFilename), OS(os) { }
+               std::unique_ptr<raw_ostream> OS)
+        : Filename(filename), TempFilename(tempFilename), OS(std::move(OS)) {}
   };
 
   /// The list of active output files.
@@ -518,7 +518,7 @@ public:
   /// addOutputFile - Add an output file onto the list of tracked output files.
   ///
   /// \param OutFile - The output file info.
-  void addOutputFile(const OutputFile &OutFile);
+  void addOutputFile(OutputFile &&OutFile);
 
   /// clearOutputFiles - Clear the output file list, destroying the contained
   /// output streams.
index 3492bf184d3b1fe1759ef48ed64bf9139fe81387..70b3bc43784b8449a96d8f44e084aee3de35120c 100644 (file)
@@ -518,15 +518,14 @@ void CompilerInstance::createSema(TranslationUnitKind TUKind,
 
 // Output Files
 
-void CompilerInstance::addOutputFile(const OutputFile &OutFile) {
+void CompilerInstance::addOutputFile(OutputFile &&OutFile) {
   assert(OutFile.OS && "Attempt to add empty stream to output list!");
-  OutputFiles.push_back(OutFile);
+  OutputFiles.push_back(std::move(OutFile));
 }
 
 void CompilerInstance::clearOutputFiles(bool EraseFiles) {
   for (std::list<OutputFile>::iterator
          it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) {
-    delete it->OS;
     if (!it->TempFilename.empty()) {
       if (EraseFiles) {
         llvm::sys::fs::remove(it->TempFilename);
@@ -561,9 +560,10 @@ CompilerInstance::createDefaultOutputFile(bool Binary,
 }
 
 llvm::raw_null_ostream *CompilerInstance::createNullOutputFile() {
-  llvm::raw_null_ostream *OS = new llvm::raw_null_ostream();
-  addOutputFile(OutputFile("", "", OS));
-  return OS;
+  auto OS = llvm::make_unique<llvm::raw_null_ostream>();
+  llvm::raw_null_ostream *Ret = OS.get();
+  addOutputFile(OutputFile("", "", std::move(OS)));
+  return Ret;
 }
 
 llvm::raw_fd_ostream *
@@ -575,21 +575,22 @@ CompilerInstance::createOutputFile(StringRef OutputPath,
                                    bool CreateMissingDirectories) {
   std::string OutputPathName, TempPathName;
   std::error_code EC;
-  llvm::raw_fd_ostream *OS = createOutputFile(
+  std::unique_ptr<llvm::raw_fd_ostream> OS(createOutputFile(
       OutputPath, EC, Binary, RemoveFileOnSignal, InFile, Extension,
-      UseTemporary, CreateMissingDirectories, &OutputPathName, &TempPathName);
+      UseTemporary, CreateMissingDirectories, &OutputPathName, &TempPathName));
   if (!OS) {
     getDiagnostics().Report(diag::err_fe_unable_to_open_output) << OutputPath
                                                                 << EC.message();
     return nullptr;
   }
 
+  llvm::raw_fd_ostream *Ret = OS.get();
   // Add the output file -- but don't try to remove "-", since this means we are
   // using stdin.
   addOutputFile(OutputFile((OutputPathName != "-") ? OutputPathName : "",
-                TempPathName, OS));
+                           TempPathName, std::move(OS)));
 
-  return OS;
+  return Ret;
 }
 
 llvm::raw_fd_ostream *CompilerInstance::createOutputFile(