<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Sun, Jan 22, 2017 at 7:23 PM Alexis Shaw via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">varno created this revision.<br class="gmail_msg">
<br class="gmail_msg">
This seemed to be an oversight seeing as DenseMap has these conversions.<br class="gmail_msg">
<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">
  include/llvm/ADT/DenseSet.h<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Index: include/llvm/ADT/DenseSet.h<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- include/llvm/ADT/DenseSet.h<br class="gmail_msg">
+++ 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() {};<br class="gmail_msg"></blockquote><div><br></div><div>What necessitated this ^ change? <br><br>Also, use = default, rather than {}. (but if you had kept the {}, there's an unnecessary semicolon after this ctor and the one in ConstIterator that would need to be removed)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
     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">
@@ -112,19 +116,27 @@<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">
+<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"></blockquote><div><br></div><div>Do you need these? The op==/!= for ConstIterator should be non-members, then you probably won't need these (because both operands can be converted to ConstIterator, and compared there).<br><br>This is why it's generally advisable to make any op overload that can be a non-member should be a non-member.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   };<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() {};<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">
@@ -134,6 +146,9 @@<br class="gmail_msg">
     ConstIterator operator++(int) { auto T = *this; ++I; return T; }<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">
+    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">
   };<br class="gmail_msg">
<br class="gmail_msg">
   typedef Iterator      iterator;<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div></div>