mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 07:31:53 +00:00
[Support] Fix latent bugs in Expected and ExitOnError that were preventing them
from working with reference types. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267448 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
acf15d11b9
commit
30e83b42ab
@ -627,7 +627,7 @@ public:
|
||||
Checked(false)
|
||||
#endif
|
||||
{
|
||||
new (getStorage()) storage_type(std::move(Val));
|
||||
new (getStorage()) storage_type(std::forward<OtherT>(Val));
|
||||
}
|
||||
|
||||
/// Move construct an Expected<T> value.
|
||||
@ -886,13 +886,20 @@ public:
|
||||
/// Check Err. If it's in a failure state log the error(s) and exit.
|
||||
void operator()(Error Err) const { checkError(std::move(Err)); }
|
||||
|
||||
/// Check E. If it's in a success state return the contained value. If it's
|
||||
/// in a failure state log the error(s) and exit.
|
||||
/// Check E. If it's in a success state then return the contained value. If
|
||||
/// it's in a failure state log the error(s) and exit.
|
||||
template <typename T> T operator()(Expected<T> &&E) const {
|
||||
checkError(E.takeError());
|
||||
return std::move(*E);
|
||||
}
|
||||
|
||||
/// Check E. If it's in a success state then return the contained reference. If
|
||||
/// it's in a failure state log the error(s) and exit.
|
||||
template <typename T> T& operator()(Expected<T&> &&E) const {
|
||||
checkError(E.takeError());
|
||||
return *E;
|
||||
}
|
||||
|
||||
private:
|
||||
void checkError(Error Err) const {
|
||||
if (Err) {
|
||||
|
@ -391,6 +391,10 @@ TEST(Error, ExitOnError) {
|
||||
EXPECT_EQ(ExitOnErr(Expected<int>(7)), 7)
|
||||
<< "exitOnError returned an invalid value for Expected";
|
||||
|
||||
int A = 7;
|
||||
int &B = ExitOnErr(Expected<int&>(A));
|
||||
EXPECT_EQ(&A, &B) << "ExitOnError failed to propagate reference";
|
||||
|
||||
// Exit tests.
|
||||
EXPECT_EXIT(ExitOnErr(make_error<CustomError>(7)),
|
||||
::testing::ExitedWithCode(1), "Error in tool:")
|
||||
@ -409,6 +413,16 @@ TEST(Error, CheckedExpectedInSuccessMode) {
|
||||
EXPECT_EQ(*A, 7) << "Incorrect Expected non-error value";
|
||||
}
|
||||
|
||||
// Test Expected with reference type.
|
||||
TEST(Error, ExpectedWithReferenceType) {
|
||||
int A = 7;
|
||||
Expected<int&> B = A;
|
||||
// 'Check' B.
|
||||
(void)!!B;
|
||||
int &C = *B;
|
||||
EXPECT_EQ(&A, &C) << "Expected failed to propagate reference";
|
||||
}
|
||||
|
||||
// Test Unchecked Expected<T> in success mode.
|
||||
// We expect this to blow up the same way Error would.
|
||||
// Test runs in debug mode only.
|
||||
|
Loading…
Reference in New Issue
Block a user