diff options
author | Reid Kleckner <reid@kleckner.net> | 2015-04-10 17:27:58 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2015-04-10 17:27:58 +0000 |
commit | 0aa128e219131558a4dbbcfa02315486069b3b91 (patch) | |
tree | 5bc84d178b67a11e542dcf1499e70d22366bd303 /clang/lib/Frontend/CompilerInstance.cpp | |
parent | d03f9f4016b90d835e28ccd11b490b81e9428b9d (diff) | |
download | llvm-0aa128e219131558a4dbbcfa02315486069b3b91.zip llvm-0aa128e219131558a4dbbcfa02315486069b3b91.tar.gz llvm-0aa128e219131558a4dbbcfa02315486069b3b91.tar.bz2 |
[Frontend] Close open file handles before renaming output files
The placement of the 'delete' call that was removed in the unique_ptr
migration in r234597 was not an accident. The raw_ostream has to be
destroyed before you do the rename on Windows, otherwise you get
ERROR_ACCESS_DENIED. We can still use unique_ptr, we just need to do a
manual reset().
Also, range-for-loop-ify this code.
llvm-svn: 234612
Diffstat (limited to 'clang/lib/Frontend/CompilerInstance.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index 5bb7f15..0628442 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -524,27 +524,29 @@ void CompilerInstance::addOutputFile(OutputFile &&OutFile) { } void CompilerInstance::clearOutputFiles(bool EraseFiles) { - for (std::list<OutputFile>::iterator - it = OutputFiles.begin(), ie = OutputFiles.end(); it != ie; ++it) { - if (!it->TempFilename.empty()) { + for (OutputFile &OF : OutputFiles) { + // Manually close the stream before we rename it. + OF.OS.reset(); + + if (!OF.TempFilename.empty()) { if (EraseFiles) { - llvm::sys::fs::remove(it->TempFilename); + llvm::sys::fs::remove(OF.TempFilename); } else { - SmallString<128> NewOutFile(it->Filename); + SmallString<128> NewOutFile(OF.Filename); // If '-working-directory' was passed, the output filename should be // relative to that. FileMgr->FixupRelativePath(NewOutFile); if (std::error_code ec = - llvm::sys::fs::rename(it->TempFilename, NewOutFile)) { + llvm::sys::fs::rename(OF.TempFilename, NewOutFile)) { getDiagnostics().Report(diag::err_unable_to_rename_temp) - << it->TempFilename << it->Filename << ec.message(); + << OF.TempFilename << OF.Filename << ec.message(); - llvm::sys::fs::remove(it->TempFilename); + llvm::sys::fs::remove(OF.TempFilename); } } - } else if (!it->Filename.empty() && EraseFiles) - llvm::sys::fs::remove(it->Filename); + } else if (!OF.Filename.empty() && EraseFiles) + llvm::sys::fs::remove(OF.Filename); } OutputFiles.clear(); |