From 47416615737795327efc3ce3c99566debe16ed04 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 17 Aug 2016 02:08:08 +0000 Subject: [PATCH] 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 --- llvm/unittests/ADT/ilistTest.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/llvm/unittests/ADT/ilistTest.cpp b/llvm/unittests/ADT/ilistTest.cpp index 377dcc0..b63cfd6 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 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 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 List; -- 2.7.4