diff --git a/llvm/include/llvm/Support/FileOutputBuffer.h b/llvm/include/llvm/Support/FileOutputBuffer.h index fd8879c84622..3bcf64a8a08b 100644 --- a/llvm/include/llvm/Support/FileOutputBuffer.h +++ b/llvm/include/llvm/Support/FileOutputBuffer.h @@ -17,6 +17,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/DataTypes.h" +#include "llvm/Support/ErrorOr.h" #include "llvm/Support/FileSystem.h" namespace llvm { @@ -37,9 +38,8 @@ public: /// Factory method to create an OutputBuffer object which manages a read/write /// buffer of the specified size. When committed, the buffer will be written /// to the file at the specified path. - static std::error_code create(StringRef FilePath, size_t Size, - std::unique_ptr &Result, - unsigned Flags = 0); + static ErrorOr> + create(StringRef FilePath, size_t Size, unsigned Flags = 0); /// Returns a pointer to the start of the buffer. uint8_t *getBufferStart() { diff --git a/llvm/lib/Support/FileOutputBuffer.cpp b/llvm/lib/Support/FileOutputBuffer.cpp index 307ff09afedc..e68ecaaa98c9 100644 --- a/llvm/lib/Support/FileOutputBuffer.cpp +++ b/llvm/lib/Support/FileOutputBuffer.cpp @@ -34,10 +34,8 @@ FileOutputBuffer::~FileOutputBuffer() { sys::fs::remove(Twine(TempPath)); } -std::error_code -FileOutputBuffer::create(StringRef FilePath, size_t Size, - std::unique_ptr &Result, - unsigned Flags) { +ErrorOr> +FileOutputBuffer::create(StringRef FilePath, size_t Size, unsigned Flags) { // If file already exists, it must be a regular file (to be mappable). sys::fs::file_status Stat; std::error_code EC = sys::fs::status(FilePath, Stat); @@ -95,10 +93,9 @@ FileOutputBuffer::create(StringRef FilePath, size_t Size, if (Ret) return std::error_code(errno, std::generic_category()); - Result.reset( + std::unique_ptr Buf( new FileOutputBuffer(std::move(MappedFile), FilePath, TempFilePath)); - - return std::error_code(); + return std::move(Buf); } std::error_code FileOutputBuffer::commit() { diff --git a/llvm/unittests/Support/FileOutputBufferTest.cpp b/llvm/unittests/Support/FileOutputBufferTest.cpp index c7e10066b4ad..090c476e35cf 100644 --- a/llvm/unittests/Support/FileOutputBufferTest.cpp +++ b/llvm/unittests/Support/FileOutputBufferTest.cpp @@ -39,8 +39,10 @@ TEST(FileOutputBuffer, Test) { SmallString<128> File1(TestDirectory); File1.append("/file1"); { - std::unique_ptr Buffer; - ASSERT_NO_ERROR(FileOutputBuffer::create(File1, 8192, Buffer)); + ErrorOr> BufferOrErr = + FileOutputBuffer::create(File1, 8192); + ASSERT_NO_ERROR(BufferOrErr.getError()); + std::unique_ptr &Buffer = *BufferOrErr; // Start buffer with special header. memcpy(Buffer->getBufferStart(), "AABBCCDDEEFFGGHHIIJJ", 20); // Write to end of buffer to verify it is writable. @@ -59,8 +61,10 @@ TEST(FileOutputBuffer, Test) { SmallString<128> File2(TestDirectory); File2.append("/file2"); { - std::unique_ptr Buffer2; - ASSERT_NO_ERROR(FileOutputBuffer::create(File2, 8192, Buffer2)); + ErrorOr> Buffer2OrErr = + FileOutputBuffer::create(File2, 8192); + ASSERT_NO_ERROR(Buffer2OrErr.getError()); + std::unique_ptr &Buffer2 = *Buffer2OrErr; // Fill buffer with special header. memcpy(Buffer2->getBufferStart(), "AABBCCDDEEFFGGHHIIJJ", 20); // Do *not* commit buffer. @@ -74,8 +78,10 @@ TEST(FileOutputBuffer, Test) { SmallString<128> File3(TestDirectory); File3.append("/file3"); { - std::unique_ptr Buffer; - ASSERT_NO_ERROR(FileOutputBuffer::create(File3, 8192000, Buffer)); + ErrorOr> BufferOrErr = + FileOutputBuffer::create(File3, 8192000); + ASSERT_NO_ERROR(BufferOrErr.getError()); + std::unique_ptr &Buffer = *BufferOrErr; // Start buffer with special header. memcpy(Buffer->getBufferStart(), "AABBCCDDEEFFGGHHIIJJ", 20); // Write to end of buffer to verify it is writable. @@ -93,9 +99,10 @@ TEST(FileOutputBuffer, Test) { SmallString<128> File4(TestDirectory); File4.append("/file4"); { - std::unique_ptr Buffer; - ASSERT_NO_ERROR(FileOutputBuffer::create(File4, 8192, Buffer, - FileOutputBuffer::F_executable)); + ErrorOr> BufferOrErr = + FileOutputBuffer::create(File4, 8192, FileOutputBuffer::F_executable); + ASSERT_NO_ERROR(BufferOrErr.getError()); + std::unique_ptr &Buffer = *BufferOrErr; // Start buffer with special header. memcpy(Buffer->getBufferStart(), "AABBCCDDEEFFGGHHIIJJ", 20); // Commit buffer.