Skip to content
Permalink
Browse files

[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
  • Loading branch information
donhinton committed Oct 17, 2019
1 parent befab66 commit ecb310b3a7cf60d2bc28aaf8caf8fd29b9f11ec9
Showing with 30 additions and 7 deletions.
  1. +20 −0 llvm/include/llvm/Support/Error.h
  2. +10 −7 llvm/unittests/Support/ErrorTest.cpp
@@ -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);
}
}
@@ -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(
{

0 comments on commit ecb310b

Please sign in to comment.
You can’t perform that action at this time.