<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>