Skip to content

Commit

Permalink
ADT: Add some missing coverage for iplist::splice
Browse files Browse the repository at this point in the history
These splices are interesting because they involve swapping two nodes in
the same list.  There are two ways to do this.  Assuming:

    A -> B -> [Sentinel]

You can either:
- splice B before A, with:        L.splice(A,       L, B) or
- splice A before Sentinel, with: L.splice(L.end(), L, A) to create:

    B -> A -> [Sentinel]

These two swapping-splices are somewhat interesting corner cases for
maintaining the list invariants.  The tests pass even with my new ilist
implementation, but I had some doubts about the latter when I was
looking at weird UB effects.  Since I can't find equivalent explicit
test coverage elsewhere it seems prudent to commit.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278887 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
dexonsmith committed Aug 17, 2016
1 parent 3b3dd88 commit eb6a210
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions unittests/ADT/ilistTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,38 @@ TEST(ilistTest, SpliceOne) {
EXPECT_EQ(3, List.back().Value);
}

TEST(ilistTest, SpliceSwap) {
ilist<Node> L;
Node N0(0);
Node N1(1);
L.insert(L.end(), &N0);
L.insert(L.end(), &N1);
EXPECT_EQ(0, L.front().Value);
EXPECT_EQ(1, L.back().Value);

L.splice(L.begin(), L, ++L.begin());
EXPECT_EQ(1, L.front().Value);
EXPECT_EQ(0, L.back().Value);

L.clearAndLeakNodesUnsafely();
}

TEST(ilistTest, SpliceSwapOtherWay) {
ilist<Node> L;
Node N0(0);
Node N1(1);
L.insert(L.end(), &N0);
L.insert(L.end(), &N1);
EXPECT_EQ(0, L.front().Value);
EXPECT_EQ(1, L.back().Value);

L.splice(L.end(), L, L.begin());
EXPECT_EQ(1, L.front().Value);
EXPECT_EQ(0, L.back().Value);

L.clearAndLeakNodesUnsafely();
}

TEST(ilistTest, UnsafeClear) {
ilist<Node> List;

Expand Down

0 comments on commit eb6a210

Please sign in to comment.