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");
|
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
|
} // end namespace llvm
|
||||||
|
|
||||||
#endif // LLVM_SUPPORT_ERROR_H
|
#endif // LLVM_SUPPORT_ERROR_H
|
||||||
|
|
|
@ -475,6 +475,10 @@ TEST(Error, CantFailSuccess) {
|
||||||
|
|
||||||
int X = cantFail(Expected<int>(42));
|
int X = cantFail(Expected<int>(42));
|
||||||
EXPECT_EQ(X, 42) << "Expected value modified by cantFail";
|
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.
|
// Test that cantFail results in a crash if you pass it a failure value.
|
||||||
|
|
Loading…
Reference in New Issue