From 14135d0fdc29ccffdffc00d313a6125c1b90c5ec Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 10 Apr 2015 14:11:52 +0000 Subject: [PATCH] Use a std::unique_ptr to make it easier to see who owns the stream. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@234597 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Frontend/CompilerInstance.h | 8 ++++---- lib/Frontend/CompilerInstance.cpp | 21 +++++++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/include/clang/Frontend/CompilerInstance.h b/include/clang/Frontend/CompilerInstance.h index ed013290e8..94966e1a5e 100644 --- a/include/clang/Frontend/CompilerInstance.h +++ b/include/clang/Frontend/CompilerInstance.h @@ -151,11 +151,11 @@ class CompilerInstance : public ModuleLoader { struct OutputFile { std::string Filename; std::string TempFilename; - raw_ostream *OS; + std::unique_ptr OS; OutputFile(const std::string &filename, const std::string &tempFilename, - raw_ostream *os) - : Filename(filename), TempFilename(tempFilename), OS(os) { } + std::unique_ptr 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. diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 3492bf184d..70b3bc4378 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -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::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 *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 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( -- 2.40.0