Index: include/llvm/Support/raw_ostream.h =================================================================== --- include/llvm/Support/raw_ostream.h +++ include/llvm/Support/raw_ostream.h @@ -223,6 +223,8 @@ raw_ostream &operator<<(double N); + raw_ostream &operator<<(std::error_code EC); + /// Output \p N in hexadecimal, without any prefix or padding. raw_ostream &write_hex(unsigned long long N); Index: lib/Support/raw_ostream.cpp =================================================================== --- lib/Support/raw_ostream.cpp +++ lib/Support/raw_ostream.cpp @@ -139,6 +139,11 @@ return *this; } +raw_ostream &raw_ostream::operator<<(std::error_code EC) { + return *this << EC.category().name() << ':' << EC.value() << ' ' + << EC.message(); +} + raw_ostream &raw_ostream::write_hex(unsigned long long N) { llvm::write_hex(*this, N, HexPrintStyle::Lower); return *this; Index: unittests/BinaryFormat/TestFileMagic.cpp =================================================================== --- unittests/BinaryFormat/TestFileMagic.cpp +++ unittests/BinaryFormat/TestFileMagic.cpp @@ -17,16 +17,7 @@ using namespace llvm; namespace fs = llvm::sys::fs; -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - SmallString<128> MessageStorage; \ - raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } +#define ASSERT_NO_ERROR(x) ASSERT_EQ(x, std::error_code()) class MagicTest : public testing::Test { protected: Index: unittests/Support/ErrorTest.cpp =================================================================== --- unittests/Support/ErrorTest.cpp +++ unittests/Support/ErrorTest.cpp @@ -933,7 +933,7 @@ class TestErrorCategory : public std::error_category { public: - const char *name() const noexcept override { return "error"; } + const char *name() const noexcept override { return "test_error"; } std::string message(int Condition) const override { switch (static_cast(Condition)) { case test_error_code::unspecified: @@ -975,4 +975,11 @@ 0); } +TEST(Error, error_codeErrorMessageTest) { + EXPECT_NONFATAL_FAILURE( + EXPECT_EQ(make_error_code(test_error_code::unspecified), + make_error_code(test_error_code::error_2)), + "Which is: test_error:1 An unknown error has occurred."); +} + } // namespace Index: unittests/Support/FileOutputBufferTest.cpp =================================================================== --- unittests/Support/FileOutputBufferTest.cpp +++ unittests/Support/FileOutputBufferTest.cpp @@ -18,16 +18,7 @@ using namespace llvm; using namespace llvm::sys; -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - SmallString<128> MessageStorage; \ - raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } +#define ASSERT_NO_ERROR(x) ASSERT_EQ(x, std::error_code()) namespace { TEST(FileOutputBuffer, Test) { Index: unittests/Support/Host.cpp =================================================================== --- unittests/Support/Host.cpp +++ unittests/Support/Host.cpp @@ -16,16 +16,7 @@ #include "gtest/gtest.h" -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - SmallString<128> MessageStorage; \ - raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } +#define ASSERT_NO_ERROR(x) ASSERT_EQ(x, std::error_code()) using namespace llvm; Index: unittests/Support/Path.cpp =================================================================== --- unittests/Support/Path.cpp +++ unittests/Support/Path.cpp @@ -38,24 +38,8 @@ using namespace llvm; using namespace llvm::sys; -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - SmallString<128> MessageStorage; \ - raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } - -#define ASSERT_ERROR(x) \ - if (!x) { \ - SmallString<128> MessageStorage; \ - raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return a failure error code.\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } +#define ASSERT_NO_ERROR(x) ASSERT_EQ(x, std::error_code()) +#define ASSERT_ERROR(x) ASSERT_NE(x, std::error_code()) namespace { @@ -1265,7 +1249,7 @@ int FileDescriptor2; SmallString<64> ResultPath; ASSERT_NO_ERROR(fs::openFileForRead(Twine(TempPath), FileDescriptor2, - fs::OF_None, &ResultPath)) + fs::OF_None, &ResultPath)); // If we succeeded, check that the paths are the same (modulo case): if (!ResultPath.empty()) { Index: unittests/Support/ProgramTest.cpp =================================================================== --- unittests/Support/ProgramTest.cpp +++ unittests/Support/ProgramTest.cpp @@ -35,16 +35,8 @@ #error sleep_for is not implemented on your platform. #endif -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - SmallString<128> MessageStorage; \ - raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } +#define ASSERT_NO_ERROR(x) ASSERT_EQ(x, std::error_code()) + // From TestMain.cpp. extern const char *TestMainArgv0; Index: unittests/Support/ReplaceFileTest.cpp =================================================================== --- unittests/Support/ReplaceFileTest.cpp +++ unittests/Support/ReplaceFileTest.cpp @@ -17,14 +17,7 @@ using namespace llvm; using namespace llvm::sys; -#define ASSERT_NO_ERROR(x) \ - do { \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - errs() << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - } \ - } while (false) +#define ASSERT_NO_ERROR(x) ASSERT_EQ(x, std::error_code()) namespace { std::error_code CreateFileWithContent(const SmallString<128> &FilePath, Index: unittests/Support/raw_pwrite_stream_test.cpp =================================================================== --- unittests/Support/raw_pwrite_stream_test.cpp +++ unittests/Support/raw_pwrite_stream_test.cpp @@ -15,16 +15,7 @@ using namespace llvm; -#define ASSERT_NO_ERROR(x) \ - if (std::error_code ASSERT_NO_ERROR_ec = x) { \ - SmallString<128> MessageStorage; \ - raw_svector_ostream Message(MessageStorage); \ - Message << #x ": did not return errc::success.\n" \ - << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \ - << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \ - GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \ - } else { \ - } +#define ASSERT_NO_ERROR(x) ASSERT_EQ(x, std::error_code()) namespace {