<div dir="ltr"><div><div>Hello Francis,<br><br></div>Could you fix the warnings added by this commit, please?<br><br><br>llvm/unittests/ADT/<wbr>SmallVectorTest.cpp: In member function ‘virtual void {anonymous}::SmallVectorTest_<wbr>AppendRepeatedNonForwardIterat<wbr>or_Test<gtest_TypeParam_>::<wbr>TestBody()’:<br>/home/andrei/llvm/llvm/<wbr>unittests/ADT/SmallVectorTest.<wbr>cpp:447:38: warning: typedef ‘{anonymous}::SmallVectorTest_<wbr>AppendRepeatedNonForwardIterat<wbr>or_Test<gtest_TypeParam_>::<wbr>TestBody()::output_iterator::<wbr>iterator_category’ locally defined but not used [-Wunused-local-typedefs]<br>     typedef std::output_iterator_tag iterator_category;<br>                              <wbr>        ^~~~~~~~~~~~~~~~~<br>llvm/unittests/ADT/<wbr>SmallVectorTest.cpp:449:17: warning: typedef ‘{anonymous}::SmallVectorTest_<wbr>AppendRepeatedNonForwardIterat<wbr>or_Test<gtest_TypeParam_>::<wbr>TestBody()::output_iterator::<wbr>difference_type’ locally defined but not used [-Wunused-local-typedefs]<br>     typedef int difference_type;<br>                 ^~~~~~~~~~~~~~~<br>llvm/unittests/ADT/<wbr>SmallVectorTest.cpp:450:25: warning: typedef ‘{anonymous}::SmallVectorTest_<wbr>AppendRepeatedNonForwardIterat<wbr>or_Test<gtest_TypeParam_>::<wbr>TestBody()::output_iterator::<wbr>pointer’ locally defined but not used [-Wunused-local-typedefs]<br>     typedef value_type *pointer;<br>                         ^~~~~~~<br>llvm/unittests/ADT/<wbr>SmallVectorTest.cpp:451:25: warning: typedef ‘{anonymous}::SmallVectorTest_<wbr>AppendRepeatedNonForwardIterat<wbr>or_Test<gtest_TypeParam_>::<wbr>TestBody()::output_iterator::<wbr>reference’ locally defined but not used [-Wunused-local-typedefs]<br>     typedef value_type &reference;<br>                         ^~~~~~~~~<br></div><div>Thanks<br><br></div><div>Galina<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 9, 2017 at 1:31 PM, Francis Ricci via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: fjricci<br>
Date: Fri Jun  9 15:31:53 2017<br>
New Revision: 305105<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=305105&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=305105&view=rev</a><br>
Log:<br>
[ADT] Make iterable SmallVector template overrides more specific<br>
<br>
Summary:<br>
This prevents the iterator overrides from being selected in<br>
the case where non-iterator types are used as arguments, which<br>
is of particular importance in cases where other overrides with<br>
identical types exist.<br>
<br>
Reviewers: dblaikie, bkramer, rafael<br>
<br>
Subscribers: llvm-commits, efriedma<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D33919" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D33919</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/ADT/<wbr>SmallVector.h<br>
    llvm/trunk/unittests/ADT/<wbr>SmallVectorTest.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/ADT/<wbr>SmallVector.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallVector.h?rev=305105&r1=305104&r2=305105&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/ADT/SmallVector.h?rev=<wbr>305105&r1=305104&r2=305105&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/ADT/<wbr>SmallVector.h (original)<br>
+++ llvm/trunk/include/llvm/ADT/<wbr>SmallVector.h Fri Jun  9 15:31:53 2017<br>
@@ -388,7 +388,10 @@ public:<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::enable_if<std::is_<wbr>convertible<<br>
+                typename std::iterator_traits<in_iter>:<wbr>:iterator_category,<br>
+                std::input_iterator_tag>::<wbr>value>::type><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 +429,11 @@ public:<br>
     std::uninitialized_fill(this-><wbr>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::enable_if<std::is_<wbr>convertible<<br>
+                typename std::iterator_traits<in_iter>:<wbr>:iterator_category,<br>
+                std::input_iterator_tag>::<wbr>value>::type><br>
+  void assign(in_iter in_start, in_iter in_end) {<br>
     clear();<br>
     append(in_start, in_end);<br>
   }<br>
@@ -579,7 +586,10 @@ public:<br>
     return I;<br>
   }<br>
<br>
-  template<typename ItTy><br>
+  template <typename ItTy,<br>
+            typename = typename std::enable_if<std::is_<wbr>convertible<<br>
+                typename std::iterator_traits<ItTy>::<wbr>iterator_category,<br>
+                std::input_iterator_tag>::<wbr>value>::type><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 +870,10 @@ public:<br>
     this->assign(Size, Value);<br>
   }<br>
<br>
-  template<typename ItTy><br>
+  template <typename ItTy,<br>
+            typename = typename std::enable_if<std::is_<wbr>convertible<<br>
+                typename std::iterator_traits<ItTy>::<wbr>iterator_category,<br>
+                std::input_iterator_tag>::<wbr>value>::type><br>
   SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {<br>
     this->append(S, E);<br>
   }<br>
<br>
Modified: llvm/trunk/unittests/ADT/<wbr>SmallVectorTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/SmallVectorTest.cpp?rev=305105&r1=305104&r2=305105&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/unittests/<wbr>ADT/SmallVectorTest.cpp?rev=<wbr>305105&r1=305104&r2=305105&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/unittests/ADT/<wbr>SmallVectorTest.cpp (original)<br>
+++ llvm/trunk/unittests/ADT/<wbr>SmallVectorTest.cpp Fri Jun  9 15:31:53 2017<br>
@@ -209,6 +209,22 @@ typedef ::testing::Types<SmallVector<<wbr>Con<br>
                          > SmallVectorTestTypes;<br>
 TYPED_TEST_CASE(<wbr>SmallVectorTest, SmallVectorTestTypes);<br>
<br>
+// Constructor test.<br>
+TYPED_TEST(SmallVectorTest, ConstructorNonIterTest) {<br>
+  SCOPED_TRACE("ConstructorTest"<wbr>);<br>
+  this->theVector = SmallVector<Constructable, 2>(2, 2);<br>
+  this->assertValuesInOrder(<wbr>this->theVector, 2u, 2, 2);<br>
+}<br>
+<br>
+// Constructor test.<br>
+TYPED_TEST(SmallVectorTest, ConstructorIterTest) {<br>
+  SCOPED_TRACE("ConstructorTest"<wbr>);<br>
+  int arr[] = {1, 2, 3};<br>
+  this->theVector =<br>
+      SmallVector<Constructable, 4>(std::begin(arr), std::end(arr));<br>
+  this->assertValuesInOrder(<wbr>this->theVector, 3u, 1, 2, 3);<br>
+}<br>
+<br>
 // New vector test.<br>
 TYPED_TEST(SmallVectorTest, EmptyVectorTest) {<br>
   SCOPED_TRACE("EmptyVectorTest"<wbr>);<br>
@@ -415,6 +431,33 @@ TYPED_TEST(SmallVectorTest, AppendRepeat<br>
   this->assertValuesInOrder(<wbr>this->theVector, 3u, 1, 77, 77);<br>
 }<br>
<br>
+// Append test<br>
+TYPED_TEST(SmallVectorTest, AppendNonIterTest) {<br>
+  SCOPED_TRACE("<wbr>AppendRepeatedTest");<br>
+<br>
+  this->theVector.push_back(<wbr>Constructable(1));<br>
+  this->theVector.append(2, 7);<br>
+  this->assertValuesInOrder(<wbr>this->theVector, 3u, 1, 7, 7);<br>
+}<br>
+<br>
+TYPED_TEST(SmallVectorTest, AppendRepeatedNonForwardIterat<wbr>or) {<br>
+  SCOPED_TRACE("<wbr>AppendRepeatedTest");<br>
+<br>
+  struct output_iterator {<br>
+    typedef std::output_iterator_tag iterator_category;<br>
+    typedef int value_type;<br>
+    typedef int difference_type;<br>
+    typedef value_type *pointer;<br>
+    typedef value_type &reference;<br>
+    operator int() { return 2; }<br>
+    operator Constructable() { return 7; }<br>
+  };<br>
+<br>
+  this->theVector.push_back(<wbr>Constructable(1));<br>
+  this->theVector.append(output_<wbr>iterator(), output_iterator());<br>
+  this->assertValuesInOrder(<wbr>this->theVector, 3u, 1, 7, 7);<br>
+}<br>
+<br>
 // Assign test<br>
 TYPED_TEST(SmallVectorTest, AssignTest) {<br>
   SCOPED_TRACE("AssignTest");<br>
@@ -434,6 +477,15 @@ TYPED_TEST(SmallVectorTest, AssignRangeT<br>
   this->assertValuesInOrder(<wbr>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(<wbr>Constructable(1));<br>
+  this->theVector.assign(2, 7);<br>
+  this->assertValuesInOrder(<wbr>this->theVector, 2u, 7, 7);<br>
+}<br>
+<br>
 // Move-assign test<br>
 TYPED_TEST(SmallVectorTest, MoveAssignTest) {<br>
   SCOPED_TRACE("MoveAssignTest")<wbr>;<br>
@@ -532,6 +584,15 @@ TYPED_TEST(SmallVectorTest, InsertRepeat<br>
   this->assertValuesInOrder(<wbr>this->theVector, 6u, 1, 16, 16, 2, 3, 4);<br>
 }<br>
<br>
+TYPED_TEST(SmallVectorTest, InsertRepeatedNonIterTest) {<br>
+  SCOPED_TRACE("<wbr>InsertRepeatedTest");<br>
+<br>
+  this->makeSequence(this-><wbr>theVector, 1, 4);<br>
+  Constructable::reset();<br>
+  auto I = this->theVector.insert(this-><wbr>theVector.begin() + 1, 2, 7);<br>
+  EXPECT_EQ(this->theVector.<wbr>begin() + 1, I);<br>
+  this->assertValuesInOrder(<wbr>this->theVector, 6u, 1, 7, 7, 2, 3, 4);<br>
+}<br>
<br>
 TYPED_TEST(SmallVectorTest, InsertRepeatedAtEndTest) {<br>
   SCOPED_TRACE("<wbr>InsertRepeatedTest");<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>