Add a cantFail overload for Expected-reference (Expected<T&>) types.

llvm-svn: 305863
This commit is contained in:
Lang Hames 2017-06-20 22:18:02 +00:00
parent 15ed292906
commit cd22753689
2 changed files with 25 additions and 0 deletions

View File

@ -1076,6 +1076,27 @@ T cantFail(Expected<T> ValOrErr) {
llvm_unreachable("Failure value returned from cantFail wrapped call");
}
/// Report a fatal error if ValOrErr is a failure value, otherwise unwraps and
/// returns the contained reference.
///
/// This function can be used to wrap calls to fallible functions ONLY when it
/// is known that the Error will always be a success value. E.g.
///
/// @code{.cpp}
/// // foo only attempts the fallible operation if DoFallibleOperation is
/// // true. If DoFallibleOperation is false then foo always returns a Bar&.
/// Expected<Bar&> foo(bool DoFallibleOperation);
///
/// Bar &X = cantFail(foo(false));
/// @endcode
template <typename T>
T& cantFail(Expected<T&> ValOrErr) {
if (ValOrErr)
return *ValOrErr;
else
llvm_unreachable("Failure value returned from cantFail wrapped call");
}
} // end namespace llvm
#endif // LLVM_SUPPORT_ERROR_H

View File

@ -475,6 +475,10 @@ TEST(Error, CantFailSuccess) {
int X = cantFail(Expected<int>(42));
EXPECT_EQ(X, 42) << "Expected value modified by cantFail";
int Dummy = 42;
int &Y = cantFail(Expected<int&>(Dummy));
EXPECT_EQ(&Dummy, &Y) << "Reference mangled by cantFail";
}
// Test that cantFail results in a crash if you pass it a failure value.