Index: llvm/trunk/include/llvm/Testing/Support/Error.h =================================================================== --- llvm/trunk/include/llvm/Testing/Support/Error.h +++ llvm/trunk/include/llvm/Testing/Support/Error.h @@ -22,12 +22,7 @@ ErrorHolder TakeError(Error Err); template ExpectedHolder TakeExpected(Expected &Exp) { - llvm::detail::ExpectedHolder Result; - auto &EH = static_cast(Result); - EH = TakeError(Exp.takeError()); - if (Result.Success) - Result.Value = &(*Exp); - return Result; + return {TakeError(Exp.takeError()), Exp}; } template ExpectedHolder TakeExpected(Expected &&Exp) { @@ -49,16 +44,15 @@ MATCHER(Failed, "") { return !arg.Success; } MATCHER_P(HasValue, value, - "succeeded with value " + testing::PrintToString(value)) { + "succeeded with value \"" + testing::PrintToString(value) + '"') { if (!arg.Success) { *result_listener << "operation failed"; return false; } - assert(arg.Value.hasValue()); - if (**arg.Value != value) { - *result_listener << "but \"" + testing::PrintToString(**arg.Value) + - "\" != " + testing::PrintToString(value); + if (*arg.Exp != value) { + *result_listener << "but \"" + testing::PrintToString(*arg.Exp) + + "\" != \"" + testing::PrintToString(value) + '"'; return false; } Index: llvm/trunk/include/llvm/Testing/Support/SupportHelpers.h =================================================================== --- llvm/trunk/include/llvm/Testing/Support/SupportHelpers.h +++ llvm/trunk/include/llvm/Testing/Support/SupportHelpers.h @@ -22,7 +22,10 @@ }; template struct ExpectedHolder : public ErrorHolder { - Optional Value; + ExpectedHolder(ErrorHolder Err, Expected &Exp) + : ErrorHolder(std::move(Err)), Exp(Exp) {} + + Expected &Exp; }; inline void PrintTo(const ErrorHolder &Err, std::ostream *Out) { @@ -35,7 +38,7 @@ template void PrintTo(const ExpectedHolder &Item, std::ostream *Out) { if (Item.Success) { - *Out << "succeeded with value \"" << ::testing::PrintToString(**Item.Value) + *Out << "succeeded with value \"" << ::testing::PrintToString(*Item.Exp) << "\""; } else { PrintTo(static_cast(Item), Out); Index: llvm/trunk/unittests/Support/CMakeLists.txt =================================================================== --- llvm/trunk/unittests/Support/CMakeLists.txt +++ llvm/trunk/unittests/Support/CMakeLists.txt @@ -68,6 +68,8 @@ xxhashTest.cpp ) +target_link_libraries(SupportTests PRIVATE LLVMTestingSupport) + # Disable all warning for AlignOfTest.cpp, # as it does things intentionally, and there is no reliable way of # disabling all warnings for all the compilers by using pragmas. Index: llvm/trunk/unittests/Support/ErrorTest.cpp =================================================================== --- llvm/trunk/unittests/Support/ErrorTest.cpp +++ llvm/trunk/unittests/Support/ErrorTest.cpp @@ -12,6 +12,8 @@ #include "llvm/ADT/Twine.h" #include "llvm/Support/Errc.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Testing/Support/Error.h" +#include "gtest/gtest-spi.h" #include "gtest/gtest.h" #include @@ -714,4 +716,42 @@ 0); } +TEST(Error, ErrorMatchers) { + EXPECT_THAT_ERROR(Error::success(), Succeeded()); + EXPECT_NONFATAL_FAILURE( + EXPECT_THAT_ERROR(make_error(0), Succeeded()), + "Expected: succeeded\n Actual: failed (CustomError { 0})"); + + EXPECT_THAT_ERROR(make_error(0), Failed()); + EXPECT_NONFATAL_FAILURE(EXPECT_THAT_ERROR(Error::success(), Failed()), + "Expected: failed\n Actual: succeeded"); + + EXPECT_THAT_EXPECTED(Expected(0), Succeeded()); + EXPECT_NONFATAL_FAILURE( + EXPECT_THAT_EXPECTED(Expected(make_error(0)), + Succeeded()), + "Expected: succeeded\n Actual: failed (CustomError { 0})"); + + EXPECT_THAT_EXPECTED(Expected(make_error(0)), Failed()); + EXPECT_NONFATAL_FAILURE( + EXPECT_THAT_EXPECTED(Expected(0), Failed()), + "Expected: failed\n Actual: succeeded with value \"0\""); + + EXPECT_THAT_EXPECTED(Expected(0), HasValue(0)); + EXPECT_NONFATAL_FAILURE( + EXPECT_THAT_EXPECTED(Expected(make_error(0)), + HasValue(0)), + "Expected: succeeded with value \"0\"\n" + " Actual: failed (CustomError { 0})"); + EXPECT_NONFATAL_FAILURE( + EXPECT_THAT_EXPECTED(Expected(1), HasValue(0)), + "Expected: succeeded with value \"0\"\n" + " Actual: succeeded with value \"1\", but \"1\" != \"0\""); + + EXPECT_THAT_EXPECTED(Expected(make_error(0)), Failed()); + int a = 1; + EXPECT_THAT_EXPECTED(Expected(a), Succeeded()); + EXPECT_THAT_EXPECTED(Expected(a), HasValue(1)); +} + } // end anon namespace