diff options
author | Don Hinton <hintonda@gmail.com> | 2019-10-17 21:54:15 +0000 |
---|---|---|
committer | Don Hinton <hintonda@gmail.com> | 2019-10-17 21:54:15 +0000 |
commit | ecb310b3a7cf60d2bc28aaf8caf8fd29b9f11ec9 (patch) | |
tree | 5d56586a677362a3a03aa5cac342911126abe542 | |
parent | befab66a2c8f0b73736e68b6400675fa9593ee23 (diff) | |
download | bcm5719-llvm-ecb310b3a7cf60d2bc28aaf8caf8fd29b9f11ec9.tar.gz bcm5719-llvm-ecb310b3a7cf60d2bc28aaf8caf8fd29b9f11ec9.zip |
[Error] Make llvm::cantFail include the original error messages
Summary:
The current implementation eats the current errors and just outputs
the message parameter passed to llvm::cantFail. This change appends
the original error message(s), so the user can see exactly why
cantFail failed. New logic is conditional on NDEBUG.
Reviewed By: lhames
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D69057
llvm-svn: 375176
-rw-r--r-- | llvm/include/llvm/Support/Error.h | 20 | ||||
-rw-r--r-- | llvm/unittests/Support/ErrorTest.cpp | 17 |
2 files changed, 30 insertions, 7 deletions
diff --git a/llvm/include/llvm/Support/Error.h b/llvm/include/llvm/Support/Error.h index f961a29b33a..350877a219b 100644 --- a/llvm/include/llvm/Support/Error.h +++ b/llvm/include/llvm/Support/Error.h @@ -704,6 +704,12 @@ inline void cantFail(Error Err, const char *Msg = nullptr) { if (Err) { if (!Msg) Msg = "Failure value returned from cantFail wrapped call"; +#ifndef NDEBUG + std::string Str; + raw_string_ostream OS(Str); + OS << Msg << "\n" << Err; + Msg = OS.str().c_str(); +#endif llvm_unreachable(Msg); } } @@ -728,6 +734,13 @@ T cantFail(Expected<T> ValOrErr, const char *Msg = nullptr) { else { if (!Msg) Msg = "Failure value returned from cantFail wrapped call"; +#ifndef NDEBUG + std::string Str; + raw_string_ostream OS(Str); + auto E = ValOrErr.takeError(); + OS << Msg << "\n" << E; + Msg = OS.str().c_str(); +#endif llvm_unreachable(Msg); } } @@ -752,6 +765,13 @@ T& cantFail(Expected<T&> ValOrErr, const char *Msg = nullptr) { else { if (!Msg) Msg = "Failure value returned from cantFail wrapped call"; +#ifndef NDEBUG + std::string Str; + raw_string_ostream OS(Str); + auto E = ValOrErr.takeError(); + OS << Msg << "\n" << E; + Msg = OS.str().c_str(); +#endif llvm_unreachable(Msg); } } diff --git a/llvm/unittests/Support/ErrorTest.cpp b/llvm/unittests/Support/ErrorTest.cpp index c4a9f3e5168..2cac94d645b 100644 --- a/llvm/unittests/Support/ErrorTest.cpp +++ b/llvm/unittests/Support/ErrorTest.cpp @@ -390,7 +390,8 @@ TEST(Error, FailureToHandle) { }; EXPECT_DEATH(FailToHandle(), - "Failure value returned from cantFail wrapped call") + "Failure value returned from cantFail wrapped call\n" + "CustomError \\{7\\}") << "Unhandled Error in handleAllErrors call did not cause an " "abort()"; } @@ -409,7 +410,8 @@ TEST(Error, FailureFromHandler) { }; EXPECT_DEATH(ReturnErrorFromHandler(), - "Failure value returned from cantFail wrapped call") + "Failure value returned from cantFail wrapped call\n" + "CustomError \\{7\\}") << " Error returned from handler in handleAllErrors call did not " "cause abort()"; } @@ -510,11 +512,12 @@ TEST(Error, CantFailSuccess) { // Test that cantFail results in a crash if you pass it a failure value. #if LLVM_ENABLE_ABI_BREAKING_CHECKS && !defined(NDEBUG) TEST(Error, CantFailDeath) { - EXPECT_DEATH( - cantFail(make_error<StringError>("foo", inconvertibleErrorCode()), - "Cantfail call failed"), - "Cantfail call failed") - << "cantFail(Error) did not cause an abort for failure value"; + EXPECT_DEATH(cantFail(make_error<StringError>("Original error message", + inconvertibleErrorCode()), + "Cantfail call failed"), + "Cantfail call failed\n" + "Original error message") + << "cantFail(Error) did not cause an abort for failure value"; EXPECT_DEATH( { |