<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Mon, Jan 23, 2017 at 8:37 PM Dean Michael Berris <<a href="mailto:dberris@google.com">dberris@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Right -- I can go ahead and add those tests</div></blockquote><div><br></div><div>Thanks</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"> (I think we've also run into the problem of Alexis not seeing the comments that are in email only)</div></blockquote><div><br></div><div>Ah - right. Should get that sorted - lots of stuff only happens in email & Phab's not perfect at reflecting email discussions. (maybe it can cope with simple top-posts? I'm not rightly sure)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">.</div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Tue, Jan 24, 2017 at 3:35 PM David Blaikie <<a href="mailto:dblaikie@gmail.com" class="gmail_msg" target="_blank">dblaikie@gmail.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Looks like this was missing test coverage for the default ctors.<br class="gmail_msg"><br class="gmail_msg">(also, think it's probably best to implement those op==/op!= as non-members - rather than the odd asymmetry of members with a ConstIterator parameter for the non-const Iterator operators, etc - you can still implement them in the class if that's more convenient by using an inline friend definition: friend bool operator==(const foo& a, const foo& b) { return a.x == b.x; } or similar)</div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Mon, Jan 23, 2017 at 8:22 PM Dean Michael Berris via Phabricator <<a href="mailto:reviews@reviews.llvm.org" class="gmail_msg" target="_blank">reviews@reviews.llvm.org</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This revision was automatically updated to reflect the committed changes.<br class="gmail_msg">
Closed by commit rL292879: Allow DenseSet::iterators to be conveted to and compared with const_iterator (authored by dberris).<br class="gmail_msg">
<br class="gmail_msg">
Changed prior to commit:<br class="gmail_msg">
  <a href="https://reviews.llvm.org/D28999?vs=85323&id=85522#toc" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D28999?vs=85323&id=85522#toc</a><br class="gmail_msg">
<br class="gmail_msg">
Repository:<br class="gmail_msg">
  rL LLVM<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D28999" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D28999</a><br class="gmail_msg">
<br class="gmail_msg">
Files:<br class="gmail_msg">
  llvm/trunk/include/llvm/ADT/DenseSet.h<br class="gmail_msg">
  llvm/trunk/unittests/ADT/DenseSetTest.cpp<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Index: llvm/trunk/unittests/ADT/DenseSetTest.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- llvm/trunk/unittests/ADT/DenseSetTest.cpp<br class="gmail_msg">
+++ llvm/trunk/unittests/ADT/DenseSetTest.cpp<br class="gmail_msg">
@@ -73,6 +73,15 @@<br class="gmail_msg">
   EXPECT_EQ(0u, set.count(3));<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+TYPED_TEST(DenseSetTest, ConstIteratorComparison){<br class="gmail_msg">
+  TypeParam set({1});<br class="gmail_msg">
+  const TypeParam &cset = set;<br class="gmail_msg">
+  EXPECT_EQ(set.begin(), cset.begin());<br class="gmail_msg">
+  EXPECT_EQ(set.end(), cset.end());<br class="gmail_msg">
+  EXPECT_NE(set.end(), cset.begin());<br class="gmail_msg">
+  EXPECT_NE(set.begin(), cset.end());<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 TYPED_TEST(DenseSetTest, EmptyInitializerList) {<br class="gmail_msg">
   TypeParam set({});<br class="gmail_msg">
   EXPECT_EQ(0u, set.size());<br class="gmail_msg">
Index: llvm/trunk/include/llvm/ADT/DenseSet.h<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/ADT/DenseSet.h<br class="gmail_msg">
+++ llvm/trunk/include/llvm/ADT/DenseSet.h<br class="gmail_msg">
@@ -90,17 +90,21 @@<br class="gmail_msg">
<br class="gmail_msg">
   // Iterators.<br class="gmail_msg">
<br class="gmail_msg">
+  class ConstIterator;<br class="gmail_msg">
+<br class="gmail_msg">
   class Iterator {<br class="gmail_msg">
     typename MapTy::iterator I;<br class="gmail_msg">
     friend class DenseSetImpl;<br class="gmail_msg">
+    friend class ConstIterator;<br class="gmail_msg">
<br class="gmail_msg">
   public:<br class="gmail_msg">
     typedef typename MapTy::iterator::difference_type difference_type;<br class="gmail_msg">
     typedef ValueT value_type;<br class="gmail_msg">
     typedef value_type *pointer;<br class="gmail_msg">
     typedef value_type &reference;<br class="gmail_msg">
     typedef std::forward_iterator_tag iterator_category;<br class="gmail_msg">
<br class="gmail_msg">
+    Iterator() = default;<br class="gmail_msg">
     Iterator(const typename MapTy::iterator &i) : I(i) {}<br class="gmail_msg">
<br class="gmail_msg">
     ValueT &operator*() { return I->getFirst(); }<br class="gmail_msg">
@@ -110,21 +114,26 @@<br class="gmail_msg">
<br class="gmail_msg">
     Iterator& operator++() { ++I; return *this; }<br class="gmail_msg">
     Iterator operator++(int) { auto T = *this; ++I; return T; }<br class="gmail_msg">
-    bool operator==(const Iterator& X) const { return I == X.I; }<br class="gmail_msg">
-    bool operator!=(const Iterator& X) const { return I != X.I; }<br class="gmail_msg">
+    bool operator==(const ConstIterator& X) const { return I == X.I; }<br class="gmail_msg">
+    bool operator!=(const ConstIterator& X) const { return I != X.I; }<br class="gmail_msg">
   };<br class="gmail_msg">
<br class="gmail_msg">
   class ConstIterator {<br class="gmail_msg">
     typename MapTy::const_iterator I;<br class="gmail_msg">
     friend class DenseSet;<br class="gmail_msg">
+    friend class Iterator;<br class="gmail_msg">
<br class="gmail_msg">
   public:<br class="gmail_msg">
     typedef typename MapTy::const_iterator::difference_type difference_type;<br class="gmail_msg">
     typedef ValueT value_type;<br class="gmail_msg">
     typedef value_type *pointer;<br class="gmail_msg">
     typedef value_type &reference;<br class="gmail_msg">
     typedef std::forward_iterator_tag iterator_category;<br class="gmail_msg">
<br class="gmail_msg">
+    ConstIterator(const Iterator &B) : I(B.I) {}<br class="gmail_msg">
+<br class="gmail_msg">
+    ConstIterator() = default;<br class="gmail_msg">
+<br class="gmail_msg">
     ConstIterator(const typename MapTy::const_iterator &i) : I(i) {}<br class="gmail_msg">
<br class="gmail_msg">
     const ValueT &operator*() const { return I->getFirst(); }<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div>
</blockquote></div>
</blockquote></div></div>