[Support] Fix a bug in ErrorList::join / joinErrors.

When concatenating two error lists the ErrorList::join method (which is called
by joinErrors) was failing to set the checked bit on the second error, leading
to a 'failure to check error' assertion.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274249 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Lang Hames 2016-06-30 17:43:06 +00:00
parent 91d41f9825
commit 3df768796a
2 changed files with 47 additions and 1 deletions

View File

@ -345,7 +345,8 @@ private:
if (E1.isA<ErrorList>()) {
auto &E1List = static_cast<ErrorList &>(*E1.getPtr());
if (E2.isA<ErrorList>()) {
auto &E2List = static_cast<ErrorList &>(*E2.getPtr());
auto E2Payload = E2.takePayload();
auto &E2List = static_cast<ErrorList &>(*E2Payload);
for (auto &Payload : E2List.Payloads)
E1List.Payloads.push_back(std::move(Payload));
} else

View File

@ -314,6 +314,51 @@ TEST(Error, CheckJoinErrors) {
EXPECT_TRUE(CustomErrorInfo1 == 7 && CustomErrorInfo2 == 42 &&
CustomErrorExtraInfo == 7)
<< "Failed handling compound Error.";
// Test appending a single item to a list.
{
int Sum = 0;
handleAllErrors(
joinErrors(
joinErrors(make_error<CustomError>(7),
make_error<CustomError>(7)),
make_error<CustomError>(7)),
[&](const CustomError &CE) {
Sum += CE.getInfo();
});
EXPECT_EQ(Sum, 21) << "Failed to correctly append error to error list.";
}
// Test prepending a single item to a list.
{
int Sum = 0;
handleAllErrors(
joinErrors(
make_error<CustomError>(7),
joinErrors(make_error<CustomError>(7),
make_error<CustomError>(7))),
[&](const CustomError &CE) {
Sum += CE.getInfo();
});
EXPECT_EQ(Sum, 21) << "Failed to correctly prepend error to error list.";
}
// Test concatenating two error lists.
{
int Sum = 0;
handleAllErrors(
joinErrors(
joinErrors(
make_error<CustomError>(7),
make_error<CustomError>(7)),
joinErrors(
make_error<CustomError>(7),
make_error<CustomError>(7))),
[&](const CustomError &CE) {
Sum += CE.getInfo();
});
EXPECT_EQ(Sum, 28) << "Failed to correctly concatenate erorr lists.";
}
}
// Test that we can consume success values.