<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><blockquote type="cite" class="">On 2016-Aug-23, at 00:55, Vitaly Buka <<a href="mailto:vitalybuka@google.com" class="">vitalybuka@google.com</a>> wrote:<br class=""><br class="">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" class="">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/24265/steps/build%20release%20tsan%20with%20clang/logs/stdio</a><br class=""></blockquote><div class=""><br class=""></div><div class="">My commit doesn't touch any of the files or data structures involved in the error, copied below for reference.</div><div class=""><br class=""></div><div class="">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 class=""><br class=""></div><div class="">Does reverting my commit actually fix the build? If so, I'm happy to revert while we sort it out...</div><div class=""><br class=""></div><div class=""><pre style="font-family: 'Courier New', courier, monotype, monospace;" class=""><span class="stderr" 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 class=""><span class="stderr" style="color: red;"><br class=""></span></div><br class=""><blockquote type="cite" class="">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" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class="">Author: dexonsmith<br class="">Date: Mon Aug 22 17:21:07 2016<br class="">New Revision: 279484<br class=""><br class="">URL: http://llvm.org/viewvc/llvm-project?rev=279484&view=rev<br class="">Log:<br class="">ADT: Separate some list manipulation API into ilist_base, NFC<br class=""><br class="">Separate algorithms in iplist<T> that don't depend on T into ilist_base,<br class="">and unit test them.<br class=""><br class="">While I was adding unit tests for these algorithms anyway, I also added<br class="">unit tests for ilist_node_base and ilist_sentinel<T>.<br class=""><br class="">To make the algorithms and unit tests easier to write, I also did the<br class="">following minor changes as a drive-by:<br class="">- encapsulate Prev/Next in ilist_node_base to so that algorithms are<br class=""> easier to read, and<br class="">- update ilist_node_access API to take nodes by reference.<br class=""><br class="">There should be no real functionality change here.<br class=""><br class="">Added:<br class=""> llvm/trunk/unittests/ADT/IListBaseTest.cpp<br class=""> llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp<br class=""> llvm/trunk/unittests/ADT/IListSentinelTest.cpp<br class="">Modified:<br class=""> llvm/trunk/include/llvm/ADT/ilist.h<br class=""> llvm/trunk/include/llvm/ADT/ilist_node.h<br class=""> llvm/trunk/unittests/ADT/CMakeLists.txt<br class=""><br class="">Modified: llvm/trunk/include/llvm/ADT/ilist.h<br class="">URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist.h?rev=279484&r1=279483&r2=279484&view=diff<br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/ADT/ilist.h (original)<br class="">+++ llvm/trunk/include/llvm/ADT/ilist.h Mon Aug 22 17:21:07 2016<br class="">@@ -50,30 +50,19 @@ struct ilist_node_access {<br class=""> return N;<br class=""> }<br class=""><br class="">- template <typename T> static ilist_node<T> *getPrev(ilist_node<T> *N) {<br class="">- return N->getPrev();<br class="">+ template <typename T> static ilist_node<T> *getPrev(ilist_node<T> &N) {<br class="">+ return N.getPrev();<br class=""> }<br class="">- template <typename T> static ilist_node<T> *getNext(ilist_node<T> *N) {<br class="">- return N->getNext();<br class="">+ template <typename T> static ilist_node<T> *getNext(ilist_node<T> &N) {<br class="">+ return N.getNext();<br class=""> }<br class="">- template <typename T> static const ilist_node<T> *getPrev(const ilist_node<T> *N) {<br class="">- return N->getPrev();<br class="">- }<br class="">- template <typename T> static const ilist_node<T> *getNext(const ilist_node<T> *N) {<br class="">- return N->getNext();<br class="">- }<br class="">-<br class="">- template <typename T> static void setPrev(ilist_node<T> *N, ilist_node<T> *Prev) {<br class="">- N->setPrev(Prev);<br class="">- }<br class="">- template <typename T> static void setNext(ilist_node<T> *N, ilist_node<T> *Next) {<br class="">- N->setNext(Next);<br class="">- }<br class="">- template <typename T> static void setPrev(ilist_node<T> *N, std::nullptr_t) {<br class="">- N->setPrev(nullptr);<br class="">- }<br class="">- template <typename T> static void setNext(ilist_node<T> *N, std::nullptr_t) {<br class="">- N->setNext(nullptr);<br class="">+ template <typename T><br class="">+ static const ilist_node<T> *getPrev(const ilist_node<T> &N) {<br class="">+ return N.getPrev();<br class="">+ }<br class="">+ template <typename T><br class="">+ static const ilist_node<T> *getNext(const ilist_node<T> &N) {<br class="">+ return N.getNext();<br class=""> }<br class=""> };<br class=""><br class="">@@ -228,12 +217,12 @@ public:<br class=""><br class=""> // Increment and decrement operators...<br class=""> ilist_iterator &operator--() {<br class="">- NodePtr = ilist_node_access::getPrev(NodePtr);<br class="">+ NodePtr = ilist_node_access::getPrev(*NodePtr);<br class=""> assert(NodePtr && "--'d off the beginning of an ilist!");<br class=""> return *this;<br class=""> }<br class=""> ilist_iterator &operator++() {<br class="">- NodePtr = ilist_node_access::getNext(NodePtr);<br class="">+ NodePtr = ilist_node_access::getNext(*NodePtr);<br class=""> return *this;<br class=""> }<br class=""> ilist_iterator operator--(int) {<br class="">@@ -271,6 +260,64 @@ template<typename NodeTy> struct simplif<br class=""> }<br class=""> };<br class=""><br class="">+/// Implementations of list algorithms using ilist_node_base.<br class="">+class ilist_base {<br class="">+public:<br class="">+ static void insertBeforeImpl(ilist_node_base &Next, ilist_node_base &N) {<br class="">+ ilist_node_base &Prev = *Next.getPrev();<br class="">+ N.setNext(&Next);<br class="">+ N.setPrev(&Prev);<br class="">+ Prev.setNext(&N);<br class="">+ Next.setPrev(&N);<br class="">+ }<br class="">+<br class="">+ static void removeImpl(ilist_node_base &N) {<br class="">+ ilist_node_base *Prev = N.getPrev();<br class="">+ ilist_node_base *Next = N.getNext();<br class="">+ Next->setPrev(Prev);<br class="">+ Prev->setNext(Next);<br class="">+<br class="">+ // Not strictly necessary, but helps catch a class of bugs.<br class="">+ N.setPrev(nullptr);<br class="">+ N.setNext(nullptr);<br class="">+ }<br class="">+<br class="">+ static void transferBeforeImpl(ilist_node_base &Next, ilist_node_base &First,<br class="">+ ilist_node_base &Last) {<br class="">+ assert(&Next != &Last && "Should be checked by callers");<br class="">+ assert(&First != &Last && "Should be checked by callers");<br class="">+ // Position cannot be contained in the range to be transferred.<br class="">+ assert(&Next != &First &&<br class="">+ // Check for the most common mistake.<br class="">+ "Insertion point can't be one of the transferred nodes");<br class="">+<br class="">+ ilist_node_base &Final = *Last.getPrev();<br class="">+<br class="">+ // Detach from old list/position.<br class="">+ First.getPrev()->setNext(&Last);<br class="">+ Last.setPrev(First.getPrev());<br class="">+<br class="">+ // Splice [First, Final] into its new list/position.<br class="">+ ilist_node_base &Prev = *Next.getPrev();<br class="">+ Final.setNext(&Next);<br class="">+ First.setPrev(&Prev);<br class="">+ Prev.setNext(&First);<br class="">+ Next.setPrev(&Final);<br class="">+ }<br class="">+<br class="">+ template <class T><br class="">+ static void insertBefore(ilist_node<T> &Next, ilist_node<T> &N) {<br class="">+ insertBeforeImpl(Next, N);<br class="">+ }<br class="">+<br class="">+ template <class T> static void remove(ilist_node<T> &N) { removeImpl(N); }<br class="">+<br class="">+ template <class T><br class="">+ static void transferBefore(ilist_node<T> &Next, ilist_node<T> &First,<br class="">+ ilist_node<T> &Last) {<br class="">+ transferBeforeImpl(Next, First, Last);<br class="">+ }<br class="">+};<br class=""><br class=""> //===----------------------------------------------------------------------===//<br class=""> //<br class="">@@ -280,7 +327,7 @@ template<typename NodeTy> struct simplif<br class=""> /// ilist_sentinel, which holds pointers to the first and last nodes in the<br class=""> /// list.<br class=""> template <typename NodeTy, typename Traits = ilist_traits<NodeTy>><br class="">-class iplist : public Traits, ilist_node_access {<br class="">+class iplist : public Traits, ilist_base, ilist_node_access {<br class=""> // TODO: Drop this assertion and the transitive type traits anytime after<br class=""> // v4.0 is branched (i.e,. keep them for one release to help out-of-tree code<br class=""> // update).<br class="">@@ -356,13 +403,7 @@ public:<br class=""> }<br class=""><br class=""> iterator insert(iterator where, NodeTy *New) {<br class="">- node_type *NewN = this->getNodePtr(New);<br class="">- node_type *Next = where.getNodePtr();<br class="">- node_type *Prev = this->getPrev(Next);<br class="">- this->setNext(NewN, Next);<br class="">- this->setPrev(NewN, Prev);<br class="">- this->setNext(Prev, NewN);<br class="">- this->setPrev(Next, NewN);<br class="">+ ilist_base::insertBefore(*where.getNodePtr(), *this->getNodePtr(New));<br class=""><br class=""> this->addNodeToList(New); // Notify traits that we added a node...<br class=""> return iterator(New);<br class="">@@ -381,24 +422,9 @@ public:<br class=""><br class=""> NodeTy *remove(iterator &IT) {<br class=""> assert(IT != end() && "Cannot remove end of list!");<br class="">- NodeTy *Node = &*IT;<br class="">- node_type *Base = this->getNodePtr(Node);<br class="">- node_type *Next = this->getNext(Base);<br class="">- node_type *Prev = this->getPrev(Base);<br class="">-<br class="">- this->setNext(Prev, Next);<br class="">- this->setPrev(Next, Prev);<br class="">- IT = iterator(*Next);<br class="">+ NodeTy *Node = &*IT++;<br class="">+ ilist_base::remove(*this->getNodePtr(Node));<br class=""> this->removeNodeFromList(Node); // Notify traits that we removed a node...<br class="">-<br class="">- // Set the next/prev pointers of the current node to null. This isn't<br class="">- // strictly required, but this catches errors where a node is removed from<br class="">- // an ilist (and potentially deleted) with iterators still pointing at it.<br class="">- // After those iterators are incremented or decremented, they become<br class="">- // default-constructed iterators, and will assert on increment, decrement,<br class="">- // and dereference instead of "usually working".<br class="">- this->setNext(Base, nullptr);<br class="">- this->setPrev(Base, nullptr);<br class=""> return Node;<br class=""> }<br class=""><br class="">@@ -431,32 +457,11 @@ private:<br class=""> // [first, last) into position.<br class=""> //<br class=""> void transfer(iterator position, iplist &L2, iterator first, iterator last) {<br class="">- assert(first != last && "Should be checked by callers");<br class="">- // Position cannot be contained in the range to be transferred.<br class="">- assert(position != first &&<br class="">- // Check for the most common mistake.<br class="">- "Insertion point can't be one of the transferred nodes");<br class="">-<br class=""> if (position == last)<br class=""> return;<br class=""><br class="">- // Get raw hooks to the first and final nodes being transferred.<br class="">- node_type *First = first.getNodePtr();<br class="">- node_type *Final = (--last).getNodePtr();<br class="">-<br class="">- // Detach from old list/position.<br class="">- node_type *Prev = this->getPrev(First);<br class="">- node_type *Next = this->getNext(Final);<br class="">- this->setNext(Prev, Next);<br class="">- this->setPrev(Next, Prev);<br class="">-<br class="">- // Splice [First, Final] into its new list/position.<br class="">- Next = position.getNodePtr();<br class="">- Prev = this->getPrev(Next);<br class="">- this->setNext(Final, Next);<br class="">- this->setPrev(First, Prev);<br class="">- this->setNext(Prev, First);<br class="">- this->setPrev(Next, Final);<br class="">+ ilist_base::transferBefore(*position.getNodePtr(), *first.getNodePtr(),<br class="">+ *last.getNodePtr());<br class=""><br class=""> // Callback. Note that the nodes have moved from before-last to<br class=""> // before-position.<br class=""><br class="">Modified: llvm/trunk/include/llvm/ADT/ilist_node.h<br class="">URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist_node.h?rev=279484&r1=279483&r2=279484&view=diff<br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/ADT/ilist_node.h (original)<br class="">+++ llvm/trunk/include/llvm/ADT/ilist_node.h Mon Aug 22 17:21:07 2016<br class="">@@ -23,18 +23,22 @@ template<typename NodeTy><br class=""> struct ilist_traits;<br class=""><br class=""> /// Base class for ilist nodes.<br class="">-struct ilist_node_base {<br class="">+class ilist_node_base {<br class=""> #ifdef LLVM_ENABLE_ABI_BREAKING_CHECKS<br class=""> PointerIntPair<ilist_node_base *, 1> PrevAndSentinel;<br class="">+#else<br class="">+ ilist_node_base *Prev = nullptr;<br class="">+#endif<br class="">+ ilist_node_base *Next = nullptr;<br class=""><br class="">+public:<br class="">+#ifdef LLVM_ENABLE_ABI_BREAKING_CHECKS<br class=""> void setPrev(ilist_node_base *Prev) { PrevAndSentinel.setPointer(Prev); }<br class=""> ilist_node_base *getPrev() const { return PrevAndSentinel.getPointer(); }<br class=""><br class=""> bool isKnownSentinel() const { return PrevAndSentinel.getInt(); }<br class=""> void initializeSentinel() { PrevAndSentinel.setInt(true); }<br class=""> #else<br class="">- ilist_node_base *Prev = nullptr;<br class="">-<br class=""> void setPrev(ilist_node_base *Prev) { this->Prev = Prev; }<br class=""> ilist_node_base *getPrev() const { return Prev; }<br class=""><br class="">@@ -42,7 +46,8 @@ struct ilist_node_base {<br class=""> void initializeSentinel() {}<br class=""> #endif<br class=""><br class="">- ilist_node_base *Next = nullptr;<br class="">+ void setNext(ilist_node_base *Next) { this->Next = Next; }<br class="">+ ilist_node_base *getNext() const { return Next; }<br class=""> };<br class=""><br class=""> struct ilist_node_access;<br class="">@@ -51,6 +56,7 @@ template <typename NodeTy> class ilist_s<br class=""><br class=""> /// Templated wrapper class.<br class=""> template <typename NodeTy> class ilist_node : ilist_node_base {<br class="">+ friend class ilist_base;<br class=""> friend struct ilist_node_access;<br class=""> friend struct ilist_traits<NodeTy>;<br class=""> friend class ilist_iterator<NodeTy>;<br class="">@@ -63,15 +69,19 @@ private:<br class=""> ilist_node *getPrev() {<br class=""> return static_cast<ilist_node *>(ilist_node_base::getPrev());<br class=""> }<br class="">- ilist_node *getNext() { return static_cast<ilist_node *>(Next); }<br class="">+ ilist_node *getNext() {<br class="">+ return static_cast<ilist_node *>(ilist_node_base::getNext());<br class="">+ }<br class=""><br class=""> const ilist_node *getPrev() const {<br class=""> return static_cast<ilist_node *>(ilist_node_base::getPrev());<br class=""> }<br class="">- const ilist_node *getNext() const { return static_cast<ilist_node *>(Next); }<br class="">+ const ilist_node *getNext() const {<br class="">+ return static_cast<ilist_node *>(ilist_node_base::getNext());<br class="">+ }<br class=""><br class=""> void setPrev(ilist_node *N) { ilist_node_base::setPrev(N); }<br class="">- void setNext(ilist_node *N) { Next = N; }<br class="">+ void setNext(ilist_node *N) { ilist_node_base::setNext(N); }<br class=""><br class=""> public:<br class=""> ilist_iterator<NodeTy> getIterator() { return ilist_iterator<NodeTy>(*this); }<br class=""><br class="">Modified: llvm/trunk/unittests/ADT/CMakeLists.txt<br class="">URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/CMakeLists.txt?rev=279484&r1=279483&r2=279484&view=diff<br class="">==============================================================================<br class="">--- llvm/trunk/unittests/ADT/CMakeLists.txt (original)<br class="">+++ llvm/trunk/unittests/ADT/CMakeLists.txt Mon Aug 22 17:21:07 2016<br class="">@@ -18,6 +18,9 @@ set(ADTSources<br class=""> FunctionRefTest.cpp<br class=""> HashingTest.cpp<br class=""> ilistTest.cpp<br class="">+ IListBaseTest.cpp<br class="">+ IListNodeBaseTest.cpp<br class="">+ IListSentinelTest.cpp<br class=""> ImmutableMapTest.cpp<br class=""> ImmutableSetTest.cpp<br class=""> IntEqClassesTest.cpp<br class=""><br class="">Added: llvm/trunk/unittests/ADT/IListBaseTest.cpp<br class="">URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListBaseTest.cpp?rev=279484&view=auto<br class="">==============================================================================<br class="">--- llvm/trunk/unittests/ADT/IListBaseTest.cpp (added)<br class="">+++ llvm/trunk/unittests/ADT/IListBaseTest.cpp Mon Aug 22 17:21:07 2016<br class="">@@ -0,0 +1,102 @@<br class="">+//===- unittests/ADT/IListBaseTest.cpp - ilist_base unit tests ------------===//<br class="">+//<br class="">+// The LLVM Compiler Infrastructure<br class="">+//<br class="">+// This file is distributed under the University of Illinois Open Source<br class="">+// License. See LICENSE.TXT for details.<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+<br class="">+#include "llvm/ADT/ilist.h"<br class="">+#include "gtest/gtest.h"<br class="">+<br class="">+using namespace llvm;<br class="">+<br class="">+namespace {<br class="">+<br class="">+TEST(IListBaseTest, insertBeforeImpl) {<br class="">+ ilist_node_base S, A, B;<br class="">+ // [S] <-> [S]<br class="">+ S.setPrev(&S);<br class="">+ S.setNext(&S);<br class="">+<br class="">+ // [S] <-> A <-> [S]<br class="">+ ilist_base::insertBeforeImpl(S, A);<br class="">+ EXPECT_EQ(&A, S.getPrev());<br class="">+ EXPECT_EQ(&S, A.getPrev());<br class="">+ EXPECT_EQ(&A, S.getNext());<br class="">+ EXPECT_EQ(&S, A.getNext());<br class="">+<br class="">+ // [S] <-> A <-> B <-> [S]<br class="">+ ilist_base::insertBeforeImpl(S, B);<br class="">+ EXPECT_EQ(&B, S.getPrev());<br class="">+ EXPECT_EQ(&A, B.getPrev());<br class="">+ EXPECT_EQ(&S, A.getPrev());<br class="">+ EXPECT_EQ(&A, S.getNext());<br class="">+ EXPECT_EQ(&B, A.getNext());<br class="">+ EXPECT_EQ(&S, B.getNext());<br class="">+}<br class="">+<br class="">+TEST(IListBaseTest, removeImpl) {<br class="">+ ilist_node_base S, A, B;<br class="">+<br class="">+ // [S] <-> A <-> B <-> [S]<br class="">+ S.setPrev(&S);<br class="">+ S.setNext(&S);<br class="">+ ilist_base::insertBeforeImpl(S, A);<br class="">+ ilist_base::insertBeforeImpl(S, B);<br class="">+<br class="">+ // [S] <-> B <-> [S]<br class="">+ ilist_base::removeImpl(A);<br class="">+ EXPECT_EQ(&B, S.getPrev());<br class="">+ EXPECT_EQ(&S, B.getPrev());<br class="">+ EXPECT_EQ(&B, S.getNext());<br class="">+ EXPECT_EQ(&S, B.getNext());<br class="">+ EXPECT_EQ(nullptr, A.getPrev());<br class="">+ EXPECT_EQ(nullptr, A.getNext());<br class="">+<br class="">+ // [S] <-> [S]<br class="">+ ilist_base::removeImpl(B);<br class="">+ EXPECT_EQ(&S, S.getPrev());<br class="">+ EXPECT_EQ(&S, S.getNext());<br class="">+ EXPECT_EQ(nullptr, B.getPrev());<br class="">+ EXPECT_EQ(nullptr, B.getNext());<br class="">+}<br class="">+<br class="">+TEST(IListBaseTest, transferBeforeImpl) {<br class="">+ ilist_node_base S1, S2, A, B, C, D, E;<br class="">+<br class="">+ // [S1] <-> A <-> B <-> C <-> [S1]<br class="">+ S1.setPrev(&S1);<br class="">+ S1.setNext(&S1);<br class="">+ ilist_base::insertBeforeImpl(S1, A);<br class="">+ ilist_base::insertBeforeImpl(S1, B);<br class="">+ ilist_base::insertBeforeImpl(S1, C);<br class="">+<br class="">+ // [S2] <-> D <-> E <-> [S2]<br class="">+ S2.setPrev(&S2);<br class="">+ S2.setNext(&S2);<br class="">+ ilist_base::insertBeforeImpl(S2, D);<br class="">+ ilist_base::insertBeforeImpl(S2, E);<br class="">+<br class="">+ // [S1] <-> C <-> [S1]<br class="">+ ilist_base::transferBeforeImpl(D, A, C);<br class="">+ EXPECT_EQ(&C, S1.getPrev());<br class="">+ EXPECT_EQ(&S1, C.getPrev());<br class="">+ EXPECT_EQ(&C, S1.getNext());<br class="">+ EXPECT_EQ(&S1, C.getNext());<br class="">+<br class="">+ // [S2] <-> A <-> B <-> D <-> E <-> [S2]<br class="">+ EXPECT_EQ(&E, S2.getPrev());<br class="">+ EXPECT_EQ(&D, E.getPrev());<br class="">+ EXPECT_EQ(&B, D.getPrev());<br class="">+ EXPECT_EQ(&A, B.getPrev());<br class="">+ EXPECT_EQ(&S2, A.getPrev());<br class="">+ EXPECT_EQ(&A, S2.getNext());<br class="">+ EXPECT_EQ(&B, A.getNext());<br class="">+ EXPECT_EQ(&D, B.getNext());<br class="">+ EXPECT_EQ(&E, D.getNext());<br class="">+ EXPECT_EQ(&S2, E.getNext());<br class="">+}<br class="">+<br class="">+} // end namespace<br class=""><br class="">Added: llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp<br class="">URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp?rev=279484&view=auto<br class="">==============================================================================<br class="">--- llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp (added)<br class="">+++ llvm/trunk/unittests/ADT/IListNodeBaseTest.cpp Mon Aug 22 17:21:07 2016<br class="">@@ -0,0 +1,60 @@<br class="">+//===- unittests/ADT/IListNodeBaseTest.cpp - ilist_node_base unit tests ---===//<br class="">+//<br class="">+// The LLVM Compiler Infrastructure<br class="">+//<br class="">+// This file is distributed under the University of Illinois Open Source<br class="">+// License. See LICENSE.TXT for details.<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+<br class="">+#include "llvm/ADT/ilist_node.h"<br class="">+#include "gtest/gtest.h"<br class="">+<br class="">+using namespace llvm;<br class="">+<br class="">+namespace {<br class="">+<br class="">+TEST(IListNodeBaseTest, DefaultConstructor) {<br class="">+ ilist_node_base A;<br class="">+ EXPECT_EQ(nullptr, A.getPrev());<br class="">+ EXPECT_EQ(nullptr, A.getNext());<br class="">+ EXPECT_FALSE(A.isKnownSentinel());<br class="">+}<br class="">+<br class="">+TEST(IListNodeBaseTest, setPrevAndNext) {<br class="">+ ilist_node_base A, B, C;<br class="">+ A.setPrev(&B);<br class="">+ EXPECT_EQ(&B, A.getPrev());<br class="">+ EXPECT_EQ(nullptr, A.getNext());<br class="">+ EXPECT_EQ(nullptr, B.getPrev());<br class="">+ EXPECT_EQ(nullptr, B.getNext());<br class="">+ EXPECT_EQ(nullptr, C.getPrev());<br class="">+ EXPECT_EQ(nullptr, C.getNext());<br class="">+<br class="">+ A.setNext(&C);<br class="">+ EXPECT_EQ(&B, A.getPrev());<br class="">+ EXPECT_EQ(&C, A.getNext());<br class="">+ EXPECT_EQ(nullptr, B.getPrev());<br class="">+ EXPECT_EQ(nullptr, B.getNext());<br class="">+ EXPECT_EQ(nullptr, C.getPrev());<br class="">+ EXPECT_EQ(nullptr, C.getNext());<br class="">+}<br class="">+<br class="">+TEST(IListNodeBaseTest, isKnownSentinel) {<br class="">+ ilist_node_base A, B;<br class="">+ EXPECT_FALSE(A.isKnownSentinel());<br class="">+ A.setPrev(&B);<br class="">+ A.setNext(&B);<br class="">+ EXPECT_EQ(&B, A.getPrev());<br class="">+ EXPECT_EQ(&B, A.getNext());<br class="">+ A.initializeSentinel();<br class="">+#ifdef LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">+ EXPECT_TRUE(A.isKnownSentinel());<br class="">+#else<br class="">+ EXPECT_FALSE(A.isKnownSentinel());<br class="">+#endif<br class="">+ EXPECT_EQ(&B, A.getPrev());<br class="">+ EXPECT_EQ(&B, A.getNext());<br class="">+}<br class="">+<br class="">+} // end namespace<br class=""><br class="">Added: llvm/trunk/unittests/ADT/IListSentinelTest.cpp<br class="">URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/IListSentinelTest.cpp?rev=279484&view=auto<br class="">==============================================================================<br class="">--- llvm/trunk/unittests/ADT/IListSentinelTest.cpp (added)<br class="">+++ llvm/trunk/unittests/ADT/IListSentinelTest.cpp Mon Aug 22 17:21:07 2016<br class="">@@ -0,0 +1,37 @@<br class="">+//===- unittests/ADT/IListSentinelTest.cpp - ilist_sentinel unit tests ----===//<br class="">+//<br class="">+// The LLVM Compiler Infrastructure<br class="">+//<br class="">+// This file is distributed under the University of Illinois Open Source<br class="">+// License. See LICENSE.TXT for details.<br class="">+//<br class="">+//===----------------------------------------------------------------------===//<br class="">+<br class="">+#include "llvm/ADT/ilist.h"<br class="">+#include "gtest/gtest.h"<br class="">+<br class="">+using namespace llvm;<br class="">+<br class="">+namespace {<br class="">+<br class="">+class Node : public ilist_node<Node> {};<br class="">+<br class="">+TEST(IListSentinelTest, DefaultConstructor) {<br class="">+ ilist_sentinel<Node> S;<br class="">+ EXPECT_EQ(&S, ilist_node_access::getPrev(S));<br class="">+ EXPECT_EQ(&S, ilist_node_access::getNext(S));<br class="">+#ifdef LLVM_ENABLE_ABI_BREAKING_CHECKS<br class="">+ EXPECT_TRUE(S.isKnownSentinel());<br class="">+#else<br class="">+ EXPECT_FALSE(S.isKnownSentinel());<br class="">+#endif<br class="">+}<br class="">+<br class="">+TEST(IListSentinelTest, NormalNodeIsNotKnownSentinel) {<br class="">+ Node N;<br class="">+ EXPECT_EQ(nullptr, ilist_node_access::getPrev(N));<br class="">+ EXPECT_EQ(nullptr, ilist_node_access::getNext(N));<br class="">+ EXPECT_FALSE(N.isKnownSentinel());<br class="">+}<br class="">+<br class="">+} // end namespace<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class="">llvm-commits@lists.llvm.org<br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""></blockquote><br class=""></body></html>