diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-08-17 02:08:08 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-08-17 02:08:08 +0000 |
commit | 47416615737795327efc3ce3c99566debe16ed04 (patch) | |
tree | 19bb036a2c2aad099f10fea0a953619e863aad04 /llvm/unittests/ADT/ilistTest.cpp | |
parent | 362d120488722bf91824f8e74748459525d10614 (diff) | |
download | bcm5719-llvm-47416615737795327efc3ce3c99566debe16ed04.tar.gz bcm5719-llvm-47416615737795327efc3ce3c99566debe16ed04.zip |
ADT: Add some missing coverage for iplist::splice
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.
llvm-svn: 278887
Diffstat (limited to 'llvm/unittests/ADT/ilistTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/ilistTest.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/ilistTest.cpp b/llvm/unittests/ADT/ilistTest.cpp index 377dcc044dd..b63cfd6310c 100644 --- a/llvm/unittests/ADT/ilistTest.cpp +++ b/llvm/unittests/ADT/ilistTest.cpp @@ -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; |