<div dir="ltr">Sorry it was just a quick look on error, and your patch was the only one in ADT.<div>Somehow build is recovered after these patches <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/24288">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/24288</a></div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Aug 23, 2016 at 7:39 AM Duncan P. N. Exon Smith <<a href="mailto:dexonsmith@apple.com">dexonsmith@apple.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><blockquote type="cite">On 2016-Aug-23, at 00:55, Vitaly Buka <<a href="mailto:vitalybuka@google.com" target="_blank">vitalybuka@google.com</a>> wrote:<br><br>Build error here: <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/24265/steps/build%20release%20tsan%20with%20clang/logs/stdio" target="_blank">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/24265/steps/build%20release%20tsan%20with%20clang/logs/stdio</a><br></blockquote><div><br></div></div><div style="word-wrap:break-word"><div>My commit doesn't touch any of the files or data structures involved in the error, copied below for reference.</div><div><br></div><div>This looks more like Tim Shen's commit in r279475. I see that it was tested in the previous build, so I'm a little confused. It seems to be an incremental bot, though, so perhaps that's the issue?</div><div><br></div><div>Does reverting my commit actually fix the build? If so, I'm happy to revert while we sort it out...</div><div><br></div><div><pre style="font-family:'Courier New',courier,monotype,monospace"><span class="m_-2311236965196395526stderr" style="color:red">In file included from /mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp:17:
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/Analysis/RegionIterator.h:80:44: error: too many arguments to function call, expected 0, have 1
succ = getNode()->getParent()->getNode(BB);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^~
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/Analysis/RegionIterator.h:132:12: note: in instantiation of member function 'llvm::RNSuccIterator<llvm::RegionNode *, llvm::BasicBlock, llvm::Region>::getISucc' requested here
return getISucc(BB);
^
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/ADT/PostOrderIterator.h:105:20: note: in instantiation of member function 'llvm::RNSuccIterator<llvm::RegionNode *, llvm::BasicBlock, llvm::Region>::operator*' requested here
NodeRef BB = *VisitStack.back().second++;
^
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/ADT/PostOrderIterator.h:116:5: note: in instantiation of member function 'llvm::po_iterator<llvm::RegionNode *, llvm::SmallPtrSet<llvm::RegionNode *, 8>, false, llvm::GraphTraits<llvm::RegionNode *> >::traverseChild' requested here
traverseChild();
^
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/ADT/PostOrderIterator.h:136:12: note: in instantiation of member function 'llvm::po_iterator<llvm::RegionNode *, llvm::SmallPtrSet<llvm::RegionNode *, 8>, false, llvm::GraphTraits<llvm::RegionNode *> >::po_iterator' requested here
return po_iterator(GT::getEntryNode(G));
^
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/ADT/PostOrderIterator.h:176:62: note: in instantiation of member function 'llvm::po_iterator<llvm::RegionNode *, llvm::SmallPtrSet<llvm::RegionNode *, 8>, false, llvm::GraphTraits<llvm::RegionNode *> >::begin' requested here
po_iterator<T> po_begin(const T &G) { return po_iterator<T>::begin(G); }
^
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/ADT/PostOrderIterator.h:282:15: note: in instantiation of function template specialization 'llvm::po_begin<llvm::RegionNode *>' requested here
std::copy(po_begin(BB), po_end(BB), std::back_inserter(Blocks));
^
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/ADT/PostOrderIterator.h:287:41: note: in instantiation of member function 'llvm::ReversePostOrderTraversal<llvm::Region *, llvm::GraphTraits<llvm::Region *> >::Initialize' requested here
ReversePostOrderTraversal(GraphT G) { Initialize(GT::getEntryNode(G)); }
^
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/lib/Transforms/Scalar/StructurizeCFG.cpp:302:38: note: in instantiation of member function 'llvm::ReversePostOrderTraversal<llvm::Region *, llvm::GraphTraits<llvm::Region *> >::ReversePostOrderTraversal' requested here
ReversePostOrderTraversal<Region*> RPOT(ParentRegion);
^
/mnt/b/sanitizer-buildbot4/sanitizer-x86_64-linux-autoconf/build/llvm/include/llvm/Analysis/RegionInfo.h:364:3: note: 'getNode' declared here
RegionNodeT *getNode() const {
^
1 error generated.
</span></pre></div></div><div style="word-wrap:break-word"><div><span class="m_-2311236965196395526stderr" style="color:red"><br></span></div><br><blockquote type="cite">On Mon, Aug 22, 2016 at 3:29 PM Duncan P. N. Exon Smith via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>Author: dexonsmith<br>Date: Mon Aug 22 17:21:07 2016<br>New Revision: 279484<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=279484&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=279484&view=rev</a><br>Log:<br>ADT: Separate some list manipulation API into ilist_base, NFC<br><br>Separate algorithms in iplist<T> that don't depend on T into ilist_base,<br>and unit test them.<br><br>While I was adding unit tests for these algorithms anyway, I also added<br>unit tests for ilist_node_base and ilist_sentinel<T>.<br><br>To make the algorithms and unit tests easier to write, I also did the<br>following minor changes as a drive-by:<br>- encapsulate Prev/Next in ilist_node_base to so that algorithms are<br> easier to read, and<br>- update ilist_node_access API to take nodes by reference.<br><br>There should be no real functionality change here.<br><br>Added:<br> llvm/trunk/unittests/ADT/IListBaseTest.cpp<br> llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp<br> llvm/trunk/unittests/ADT/IListSentinelTest.cpp<br>Modified:<br> llvm/trunk/include/llvm/ADT/ilist.h<br> llvm/trunk/include/llvm/ADT/ilist_node.h<br> llvm/trunk/unittests/ADT/CMakeLists.txt<br><br>Modified: llvm/trunk/include/llvm/ADT/ilist.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist.h?rev=279484&r1=279483&r2=279484&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist.h?rev=279484&r1=279483&r2=279484&view=diff</a><br>==============================================================================<br>--- llvm/trunk/include/llvm/ADT/ilist.h (original)<br>+++ llvm/trunk/include/llvm/ADT/ilist.h Mon Aug 22 17:21:07 2016<br>@@ -50,30 +50,19 @@ struct ilist_node_access {<br> return N;<br> }<br><br>- template <typename T> static ilist_node<T> *getPrev(ilist_node<T> *N) {<br>- return N->getPrev();<br>+ template <typename T> static ilist_node<T> *getPrev(ilist_node<T> &N) {<br>+ return N.getPrev();<br> }<br>- template <typename T> static ilist_node<T> *getNext(ilist_node<T> *N) {<br>- return N->getNext();<br>+ template <typename T> static ilist_node<T> *getNext(ilist_node<T> &N) {<br>+ return N.getNext();<br> }<br>- template <typename T> static const ilist_node<T> *getPrev(const ilist_node<T> *N) {<br>- return N->getPrev();<br>- }<br>- template <typename T> static const ilist_node<T> *getNext(const ilist_node<T> *N) {<br>- return N->getNext();<br>- }<br>-<br>- template <typename T> static void setPrev(ilist_node<T> *N, ilist_node<T> *Prev) {<br>- N->setPrev(Prev);<br>- }<br>- template <typename T> static void setNext(ilist_node<T> *N, ilist_node<T> *Next) {<br>- N->setNext(Next);<br>- }<br>- template <typename T> static void setPrev(ilist_node<T> *N, std::nullptr_t) {<br>- N->setPrev(nullptr);<br>- }<br>- template <typename T> static void setNext(ilist_node<T> *N, std::nullptr_t) {<br>- N->setNext(nullptr);<br>+ template <typename T><br>+ static const ilist_node<T> *getPrev(const ilist_node<T> &N) {<br>+ return N.getPrev();<br>+ }<br>+ template <typename T><br>+ static const ilist_node<T> *getNext(const ilist_node<T> &N) {<br>+ return N.getNext();<br> }<br> };<br><br>@@ -228,12 +217,12 @@ public:<br><br> // Increment and decrement operators...<br> ilist_iterator &operator--() {<br>- NodePtr = ilist_node_access::getPrev(NodePtr);<br>+ NodePtr = ilist_node_access::getPrev(*NodePtr);<br> assert(NodePtr && "--'d off the beginning of an ilist!");<br> return *this;<br> }<br> ilist_iterator &operator++() {<br>- NodePtr = ilist_node_access::getNext(NodePtr);<br>+ NodePtr = ilist_node_access::getNext(*NodePtr);<br> return *this;<br> }<br> ilist_iterator operator--(int) {<br>@@ -271,6 +260,64 @@ template<typename NodeTy> struct simplif<br> }<br> };<br><br>+/// Implementations of list algorithms using ilist_node_base.<br>+class ilist_base {<br>+public:<br>+ static void insertBeforeImpl(ilist_node_base &Next, ilist_node_base &N) {<br>+ ilist_node_base &Prev = *Next.getPrev();<br>+ N.setNext(&Next);<br>+ N.setPrev(&Prev);<br>+ Prev.setNext(&N);<br>+ Next.setPrev(&N);<br>+ }<br>+<br>+ static void removeImpl(ilist_node_base &N) {<br>+ ilist_node_base *Prev = N.getPrev();<br>+ ilist_node_base *Next = N.getNext();<br>+ Next->setPrev(Prev);<br>+ Prev->setNext(Next);<br>+<br>+ // Not strictly necessary, but helps catch a class of bugs.<br>+ N.setPrev(nullptr);<br>+ N.setNext(nullptr);<br>+ }<br>+<br>+ static void transferBeforeImpl(ilist_node_base &Next, ilist_node_base &First,<br>+ ilist_node_base &Last) {<br>+ assert(&Next != &Last && "Should be checked by callers");<br>+ assert(&First != &Last && "Should be checked by callers");<br>+ // Position cannot be contained in the range to be transferred.<br>+ assert(&Next != &First &&<br>+ // Check for the most common mistake.<br>+ "Insertion point can't be one of the transferred nodes");<br>+<br>+ ilist_node_base &Final = *Last.getPrev();<br>+<br>+ // Detach from old list/position.<br>+ First.getPrev()->setNext(&Last);<br>+ Last.setPrev(First.getPrev());<br>+<br>+ // Splice [First, Final] into its new list/position.<br>+ ilist_node_base &Prev = *Next.getPrev();<br>+ Final.setNext(&Next);<br>+ First.setPrev(&Prev);<br>+ Prev.setNext(&First);<br>+ Next.setPrev(&Final);<br>+ }<br>+<br>+ template <class T><br>+ static void insertBefore(ilist_node<T> &Next, ilist_node<T> &N) {<br>+ insertBeforeImpl(Next, N);<br>+ }<br>+<br>+ template <class T> static void remove(ilist_node<T> &N) { removeImpl(N); }<br>+<br>+ template <class T><br>+ static void transferBefore(ilist_node<T> &Next, ilist_node<T> &First,<br>+ ilist_node<T> &Last) {<br>+ transferBeforeImpl(Next, First, Last);<br>+ }<br>+};<br><br> //===----------------------------------------------------------------------===//<br> //<br>@@ -280,7 +327,7 @@ template<typename NodeTy> struct simplif<br> /// ilist_sentinel, which holds pointers to the first and last nodes in the<br> /// list.<br> template <typename NodeTy, typename Traits = ilist_traits<NodeTy>><br>-class iplist : public Traits, ilist_node_access {<br>+class iplist : public Traits, ilist_base, ilist_node_access {<br> // TODO: Drop this assertion and the transitive type traits anytime after<br> // v4.0 is branched (i.e,. keep them for one release to help out-of-tree code<br> // update).<br>@@ -356,13 +403,7 @@ public:<br> }<br><br> iterator insert(iterator where, NodeTy *New) {<br>- node_type *NewN = this->getNodePtr(New);<br>- node_type *Next = where.getNodePtr();<br>- node_type *Prev = this->getPrev(Next);<br>- this->setNext(NewN, Next);<br>- this->setPrev(NewN, Prev);<br>- this->setNext(Prev, NewN);<br>- this->setPrev(Next, NewN);<br>+ ilist_base::insertBefore(*where.getNodePtr(), *this->getNodePtr(New));<br><br> this->addNodeToList(New); // Notify traits that we added a node...<br> return iterator(New);<br>@@ -381,24 +422,9 @@ public:<br><br> NodeTy *remove(iterator &IT) {<br> assert(IT != end() && "Cannot remove end of list!");<br>- NodeTy *Node = &*IT;<br>- node_type *Base = this->getNodePtr(Node);<br>- node_type *Next = this->getNext(Base);<br>- node_type *Prev = this->getPrev(Base);<br>-<br>- this->setNext(Prev, Next);<br>- this->setPrev(Next, Prev);<br>- IT = iterator(*Next);<br>+ NodeTy *Node = &*IT++;<br>+ ilist_base::remove(*this->getNodePtr(Node));<br> this->removeNodeFromList(Node); // Notify traits that we removed a node...<br>-<br>- // Set the next/prev pointers of the current node to null. This isn't<br>- // strictly required, but this catches errors where a node is removed from<br>- // an ilist (and potentially deleted) with iterators still pointing at it.<br>- // After those iterators are incremented or decremented, they become<br>- // default-constructed iterators, and will assert on increment, decrement,<br>- // and dereference instead of "usually working".<br>- this->setNext(Base, nullptr);<br>- this->setPrev(Base, nullptr);<br> return Node;<br> }<br><br>@@ -431,32 +457,11 @@ private:<br> // [first, last) into position.<br> //<br> void transfer(iterator position, iplist &L2, iterator first, iterator last) {<br>- assert(first != last && "Should be checked by callers");<br>- // Position cannot be contained in the range to be transferred.<br>- assert(position != first &&<br>- // Check for the most common mistake.<br>- "Insertion point can't be one of the transferred nodes");<br>-<br> if (position == last)<br> return;<br><br>- // Get raw hooks to the first and final nodes being transferred.<br>- node_type *First = first.getNodePtr();<br>- node_type *Final = (--last).getNodePtr();<br>-<br>- // Detach from old list/position.<br>- node_type *Prev = this->getPrev(First);<br>- node_type *Next = this->getNext(Final);<br>- this->setNext(Prev, Next);<br>- this->setPrev(Next, Prev);<br>-<br>- // Splice [First, Final] into its new list/position.<br>- Next = position.getNodePtr();<br>- Prev = this->getPrev(Next);<br>- this->setNext(Final, Next);<br>- this->setPrev(First, Prev);<br>- this->setNext(Prev, First);<br>- this->setPrev(Next, Final);<br>+ ilist_base::transferBefore(*position.getNodePtr(), *first.getNodePtr(),<br>+ *last.getNodePtr());<br><br> // Callback. Note that the nodes have moved from before-last to<br> // before-position.<br><br>Modified: llvm/trunk/include/llvm/ADT/ilist_node.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist_node.h?rev=279484&r1=279483&r2=279484&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist_node.h?rev=279484&r1=279483&r2=279484&view=diff</a><br>==============================================================================<br>--- llvm/trunk/include/llvm/ADT/ilist_node.h (original)<br>+++ llvm/trunk/include/llvm/ADT/ilist_node.h Mon Aug 22 17:21:07 2016<br>@@ -23,18 +23,22 @@ template<typename NodeTy><br> struct ilist_traits;<br><br> /// Base class for ilist nodes.<br>-struct ilist_node_base {<br>+class ilist_node_base {<br> #ifdef LLVM_ENABLE_ABI_BREAKING_CHECKS<br> PointerIntPair<ilist_node_base *, 1> PrevAndSentinel;<br>+#else<br>+ ilist_node_base *Prev = nullptr;<br>+#endif<br>+ ilist_node_base *Next = nullptr;<br><br>+public:<br>+#ifdef LLVM_ENABLE_ABI_BREAKING_CHECKS<br> void setPrev(ilist_node_base *Prev) { PrevAndSentinel.setPointer(Prev); }<br> ilist_node_base *getPrev() const { return PrevAndSentinel.getPointer(); }<br><br> bool isKnownSentinel() const { return PrevAndSentinel.getInt(); }<br> void initializeSentinel() { PrevAndSentinel.setInt(true); }<br> #else<br>- ilist_node_base *Prev = nullptr;<br>-<br> void setPrev(ilist_node_base *Prev) { this->Prev = Prev; }<br> ilist_node_base *getPrev() const { return Prev; }<br><br>@@ -42,7 +46,8 @@ struct ilist_node_base {<br> void initializeSentinel() {}<br> #endif<br><br>- ilist_node_base *Next = nullptr;<br>+ void setNext(ilist_node_base *Next) { this->Next = Next; }<br>+ ilist_node_base *getNext() const { return Next; }<br> };<br><br> struct ilist_node_access;<br>@@ -51,6 +56,7 @@ template <typename NodeTy> class ilist_s<br><br> /// Templated wrapper class.<br> template <typename NodeTy> class ilist_node : ilist_node_base {<br>+ friend class ilist_base;<br> friend struct ilist_node_access;<br> friend struct ilist_traits<NodeTy>;<br> friend class ilist_iterator<NodeTy>;<br>@@ -63,15 +69,19 @@ private:<br> ilist_node *getPrev() {<br> return static_cast<ilist_node *>(ilist_node_base::getPrev());<br> }<br>- ilist_node *getNext() { return static_cast<ilist_node *>(Next); }<br>+ ilist_node *getNext() {<br>+ return static_cast<ilist_node *>(ilist_node_base::getNext());<br>+ }<br><br> const ilist_node *getPrev() const {<br> return static_cast<ilist_node *>(ilist_node_base::getPrev());<br> }<br>- const ilist_node *getNext() const { return static_cast<ilist_node *>(Next); }<br>+ const ilist_node *getNext() const {<br>+ return static_cast<ilist_node *>(ilist_node_base::getNext());<br>+ }<br><br> void setPrev(ilist_node *N) { ilist_node_base::setPrev(N); }<br>- void setNext(ilist_node *N) { Next = N; }<br>+ void setNext(ilist_node *N) { ilist_node_base::setNext(N); }<br><br> public:<br> ilist_iterator<NodeTy> getIterator() { return ilist_iterator<NodeTy>(*this); }<br><br>Modified: llvm/trunk/unittests/ADT/CMakeLists.txt<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/CMakeLists.txt?rev=279484&r1=279483&r2=279484&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/CMakeLists.txt?rev=279484&r1=279483&r2=279484&view=diff</a><br>==============================================================================<br>--- llvm/trunk/unittests/ADT/CMakeLists.txt (original)<br>+++ llvm/trunk/unittests/ADT/CMakeLists.txt Mon Aug 22 17:21:07 2016<br>@@ -18,6 +18,9 @@ set(ADTSources<br> FunctionRefTest.cpp<br> HashingTest.cpp<br> ilistTest.cpp<br>+ IListBaseTest.cpp<br>+ IListNodeBaseTest.cpp<br>+ IListSentinelTest.cpp<br> ImmutableMapTest.cpp<br> ImmutableSetTest.cpp<br> IntEqClassesTest.cpp<br><br>Added: llvm/trunk/unittests/ADT/IListBaseTest.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListBaseTest.cpp?rev=279484&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListBaseTest.cpp?rev=279484&view=auto</a><br>==============================================================================<br>--- llvm/trunk/unittests/ADT/IListBaseTest.cpp (added)<br>+++ llvm/trunk/unittests/ADT/IListBaseTest.cpp Mon Aug 22 17:21:07 2016<br>@@ -0,0 +1,102 @@<br>+//===- unittests/ADT/IListBaseTest.cpp - ilist_base unit tests ------------===//<br>+//<br>+// The LLVM Compiler Infrastructure<br>+//<br>+// This file is distributed under the University of Illinois Open Source<br>+// License. See LICENSE.TXT for details.<br>+//<br>+//===----------------------------------------------------------------------===//<br>+<br>+#include "llvm/ADT/ilist.h"<br>+#include "gtest/gtest.h"<br>+<br>+using namespace llvm;<br>+<br>+namespace {<br>+<br>+TEST(IListBaseTest, insertBeforeImpl) {<br>+ ilist_node_base S, A, B;<br>+ // [S] <-> [S]<br>+ S.setPrev(&S);<br>+ S.setNext(&S);<br>+<br>+ // [S] <-> A <-> [S]<br>+ ilist_base::insertBeforeImpl(S, A);<br>+ EXPECT_EQ(&A, S.getPrev());<br>+ EXPECT_EQ(&S, A.getPrev());<br>+ EXPECT_EQ(&A, S.getNext());<br>+ EXPECT_EQ(&S, A.getNext());<br>+<br>+ // [S] <-> A <-> B <-> [S]<br>+ ilist_base::insertBeforeImpl(S, B);<br>+ EXPECT_EQ(&B, S.getPrev());<br>+ EXPECT_EQ(&A, B.getPrev());<br>+ EXPECT_EQ(&S, A.getPrev());<br>+ EXPECT_EQ(&A, S.getNext());<br>+ EXPECT_EQ(&B, A.getNext());<br>+ EXPECT_EQ(&S, B.getNext());<br>+}<br>+<br>+TEST(IListBaseTest, removeImpl) {<br>+ ilist_node_base S, A, B;<br>+<br>+ // [S] <-> A <-> B <-> [S]<br>+ S.setPrev(&S);<br>+ S.setNext(&S);<br>+ ilist_base::insertBeforeImpl(S, A);<br>+ ilist_base::insertBeforeImpl(S, B);<br>+<br>+ // [S] <-> B <-> [S]<br>+ ilist_base::removeImpl(A);<br>+ EXPECT_EQ(&B, S.getPrev());<br>+ EXPECT_EQ(&S, B.getPrev());<br>+ EXPECT_EQ(&B, S.getNext());<br>+ EXPECT_EQ(&S, B.getNext());<br>+ EXPECT_EQ(nullptr, A.getPrev());<br>+ EXPECT_EQ(nullptr, A.getNext());<br>+<br>+ // [S] <-> [S]<br>+ ilist_base::removeImpl(B);<br>+ EXPECT_EQ(&S, S.getPrev());<br>+ EXPECT_EQ(&S, S.getNext());<br>+ EXPECT_EQ(nullptr, B.getPrev());<br>+ EXPECT_EQ(nullptr, B.getNext());<br>+}<br>+<br>+TEST(IListBaseTest, transferBeforeImpl) {<br>+ ilist_node_base S1, S2, A, B, C, D, E;<br>+<br>+ // [S1] <-> A <-> B <-> C <-> [S1]<br>+ S1.setPrev(&S1);<br>+ S1.setNext(&S1);<br>+ ilist_base::insertBeforeImpl(S1, A);<br>+ ilist_base::insertBeforeImpl(S1, B);<br>+ ilist_base::insertBeforeImpl(S1, C);<br>+<br>+ // [S2] <-> D <-> E <-> [S2]<br>+ S2.setPrev(&S2);<br>+ S2.setNext(&S2);<br>+ ilist_base::insertBeforeImpl(S2, D);<br>+ ilist_base::insertBeforeImpl(S2, E);<br>+<br>+ // [S1] <-> C <-> [S1]<br>+ ilist_base::transferBeforeImpl(D, A, C);<br>+ EXPECT_EQ(&C, S1.getPrev());<br>+ EXPECT_EQ(&S1, C.getPrev());<br>+ EXPECT_EQ(&C, S1.getNext());<br>+ EXPECT_EQ(&S1, C.getNext());<br>+<br>+ // [S2] <-> A <-> B <-> D <-> E <-> [S2]<br>+ EXPECT_EQ(&E, S2.getPrev());<br>+ EXPECT_EQ(&D, E.getPrev());<br>+ EXPECT_EQ(&B, D.getPrev());<br>+ EXPECT_EQ(&A, B.getPrev());<br>+ EXPECT_EQ(&S2, A.getPrev());<br>+ EXPECT_EQ(&A, S2.getNext());<br>+ EXPECT_EQ(&B, A.getNext());<br>+ EXPECT_EQ(&D, B.getNext());<br>+ EXPECT_EQ(&E, D.getNext());<br>+ EXPECT_EQ(&S2, E.getNext());<br>+}<br>+<br>+} // end namespace<br><br>Added: llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp?rev=279484&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp?rev=279484&view=auto</a><br>==============================================================================<br>--- llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp (added)<br>+++ llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp Mon Aug 22 17:21:07 2016<br>@@ -0,0 +1,60 @@<br>+//===- unittests/ADT/IListNodeBaseTest.cpp - ilist_node_base unit tests ---===//<br>+//<br>+// The LLVM Compiler Infrastructure<br>+//<br>+// This file is distributed under the University of Illinois Open Source<br>+// License. See LICENSE.TXT for details.<br>+//<br>+//===----------------------------------------------------------------------===//<br>+<br>+#include "llvm/ADT/ilist_node.h"<br>+#include "gtest/gtest.h"<br>+<br>+using namespace llvm;<br>+<br>+namespace {<br>+<br>+TEST(IListNodeBaseTest, DefaultConstructor) {<br>+ ilist_node_base A;<br>+ EXPECT_EQ(nullptr, A.getPrev());<br>+ EXPECT_EQ(nullptr, A.getNext());<br>+ EXPECT_FALSE(A.isKnownSentinel());<br>+}<br>+<br>+TEST(IListNodeBaseTest, setPrevAndNext) {<br>+ ilist_node_base A, B, C;<br>+ A.setPrev(&B);<br>+ EXPECT_EQ(&B, A.getPrev());<br>+ EXPECT_EQ(nullptr, A.getNext());<br>+ EXPECT_EQ(nullptr, B.getPrev());<br>+ EXPECT_EQ(nullptr, B.getNext());<br>+ EXPECT_EQ(nullptr, C.getPrev());<br>+ EXPECT_EQ(nullptr, C.getNext());<br>+<br>+ A.setNext(&C);<br>+ EXPECT_EQ(&B, A.getPrev());<br>+ EXPECT_EQ(&C, A.getNext());<br>+ EXPECT_EQ(nullptr, B.getPrev());<br>+ EXPECT_EQ(nullptr, B.getNext());<br>+ EXPECT_EQ(nullptr, C.getPrev());<br>+ EXPECT_EQ(nullptr, C.getNext());<br>+}<br>+<br>+TEST(IListNodeBaseTest, isKnownSentinel) {<br>+ ilist_node_base A, B;<br>+ EXPECT_FALSE(A.isKnownSentinel());<br>+ A.setPrev(&B);<br>+ A.setNext(&B);<br>+ EXPECT_EQ(&B, A.getPrev());<br>+ EXPECT_EQ(&B, A.getNext());<br>+ A.initializeSentinel();<br>+#ifdef LLVM_ENABLE_ABI_BREAKING_CHECKS<br>+ EXPECT_TRUE(A.isKnownSentinel());<br>+#else<br>+ EXPECT_FALSE(A.isKnownSentinel());<br>+#endif<br>+ EXPECT_EQ(&B, A.getPrev());<br>+ EXPECT_EQ(&B, A.getNext());<br>+}<br>+<br>+} // end namespace<br><br>Added: llvm/trunk/unittests/ADT/IListSentinelTest.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListSentinelTest.cpp?rev=279484&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListSentinelTest.cpp?rev=279484&view=auto</a><br>==============================================================================<br>--- llvm/trunk/unittests/ADT/IListSentinelTest.cpp (added)<br>+++ llvm/trunk/unittests/ADT/IListSentinelTest.cpp Mon Aug 22 17:21:07 2016<br>@@ -0,0 +1,37 @@<br>+//===- unittests/ADT/IListSentinelTest.cpp - ilist_sentinel unit tests ----===//<br>+//<br>+// The LLVM Compiler Infrastructure<br>+//<br>+// This file is distributed under the University of Illinois Open Source<br>+// License. See LICENSE.TXT for details.<br>+//<br>+//===----------------------------------------------------------------------===//<br>+<br>+#include "llvm/ADT/ilist.h"<br>+#include "gtest/gtest.h"<br>+<br>+using namespace llvm;<br>+<br>+namespace {<br>+<br>+class Node : public ilist_node<Node> {};<br>+<br>+TEST(IListSentinelTest, DefaultConstructor) {<br>+ ilist_sentinel<Node> S;<br>+ EXPECT_EQ(&S, ilist_node_access::getPrev(S));<br>+ EXPECT_EQ(&S, ilist_node_access::getNext(S));<br>+#ifdef LLVM_ENABLE_ABI_BREAKING_CHECKS<br>+ EXPECT_TRUE(S.isKnownSentinel());<br>+#else<br>+ EXPECT_FALSE(S.isKnownSentinel());<br>+#endif<br>+}<br>+<br>+TEST(IListSentinelTest, NormalNodeIsNotKnownSentinel) {<br>+ Node N;<br>+ EXPECT_EQ(nullptr, ilist_node_access::getPrev(N));<br>+ EXPECT_EQ(nullptr, ilist_node_access::getNext(N));<br>+ EXPECT_FALSE(N.isKnownSentinel());<br>+}<br>+<br>+} // end namespace<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br></blockquote><br></div></blockquote></div>