<div dir="ltr">Looks a bit different from the is_forward_iterator type check that libc++ uses. Any idea what the tradeoffs are there? Why this solution is equivalent/as good/correct?<br><br>(should have test coverage for all 3 variants that are modified)</div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jun 7, 2017 at 1:57 PM Francis Ricci 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">fjricci updated this revision to Diff 101813.<br>
fjricci retitled this revision from "[ADT] Ensure that correct overrides for SmallVector assign are selected" to "[ADT] Make iterable SmallVector template overrides more specific".<br>
fjricci edited the summary of this revision.<br>
fjricci added a comment.<br>
<br>
Add unit test and migrate to iterator SFINAE checks<br>
<br>
<br>
<a href="https://reviews.llvm.org/D33919" rel="noreferrer" target="_blank">https://reviews.llvm.org/D33919</a><br>
<br>
Files:<br>
  include/llvm/ADT/SmallVector.h<br>
  unittests/ADT/SmallVectorTest.cpp<br>
<br>
<br>
Index: unittests/ADT/SmallVectorTest.cpp<br>
===================================================================<br>
--- unittests/ADT/SmallVectorTest.cpp<br>
+++ unittests/ADT/SmallVectorTest.cpp<br>
@@ -434,6 +434,15 @@<br>
   this->assertValuesInOrder(this->theVector, 3u, 1, 2, 3);<br>
 }<br>
<br>
+// Assign test<br>
+TYPED_TEST(SmallVectorTest, AssignNonIterTest) {<br>
+  SCOPED_TRACE("AssignTest");<br>
+<br>
+  this->theVector.push_back(Constructable(1));<br>
+  this->theVector.assign(2, 2);<br>
+  this->assertValuesInOrder(this->theVector, 2u, 2);<br>
+}<br>
+<br>
 // Move-assign test<br>
 TYPED_TEST(SmallVectorTest, MoveAssignTest) {<br>
   SCOPED_TRACE("MoveAssignTest");<br>
Index: include/llvm/ADT/SmallVector.h<br>
===================================================================<br>
--- include/llvm/ADT/SmallVector.h<br>
+++ include/llvm/ADT/SmallVector.h<br>
@@ -388,7 +388,8 @@<br>
   void swap(SmallVectorImpl &RHS);<br>
<br>
   /// Add the specified range to the end of the SmallVector.<br>
-  template<typename in_iter><br>
+  template <typename in_iter,<br>
+            typename = typename std::iterator_traits<in_iter>::pointer><br>
   void append(in_iter in_start, in_iter in_end) {<br>
     size_type NumInputs = std::distance(in_start, in_end);<br>
     // Grow allocated space if needed.<br>
@@ -426,7 +427,9 @@<br>
     std::uninitialized_fill(this->begin(), this->end(), Elt);<br>
   }<br>
<br>
-  template <typename in_iter> void assign(in_iter in_start, in_iter in_end) {<br>
+  template <typename in_iter,<br>
+            typename = typename std::iterator_traits<in_iter>::pointer><br>
+  void assign(in_iter in_start, in_iter in_end) {<br>
     clear();<br>
     append(in_start, in_end);<br>
   }<br>
@@ -579,7 +582,8 @@<br>
     return I;<br>
   }<br>
<br>
-  template<typename ItTy><br>
+  template <typename ItTy,<br>
+            typename = typename std::iterator_traits<ItTy>::pointer><br>
   iterator insert(iterator I, ItTy From, ItTy To) {<br>
     // Convert iterator to elt# to avoid invalidating iterator when we reserve()<br>
     size_t InsertElt = I - this->begin();<br>
@@ -860,7 +864,8 @@<br>
     this->assign(Size, Value);<br>
   }<br>
<br>
-  template<typename ItTy><br>
+  template <typename ItTy,<br>
+            typename = typename std::iterator_traits<ItTy>::pointer><br>
   SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {<br>
     this->append(S, E);<br>
   }<br>
<br>
<br>
</blockquote></div>