forked from OSchip/llvm-project
Add a cantFail overload for Expected-reference (Expected<T&>) types.
llvm-svn: 305863
This commit is contained in:
parent
15ed292906
commit
cd22753689
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue