[libcxx] r302070 - Merge r300397 - Fix PR32642 - string::insert and string::append don't work with move_iterator.

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Wed May 3 12:48:55 PDT 2017


Author: ericwf
Date: Wed May  3 14:48:55 2017
New Revision: 302070

URL: http://llvm.org/viewvc/llvm-project?rev=302070&view=rev
Log:
Merge r300397 - Fix PR32642 - string::insert and string::append don't work with move_iterator.

Modified:
    libcxx/branches/release_40/include/string
    libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp
    libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp

Modified: libcxx/branches/release_40/include/string
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_40/include/string?rev=302070&r1=302069&r2=302070&view=diff
==============================================================================
--- libcxx/branches/release_40/include/string (original)
+++ libcxx/branches/release_40/include/string Wed May  3 14:48:55 2017
@@ -2242,7 +2242,9 @@ basic_string<_CharT, _Traits, _Allocator
     size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
     if (__n)
     {
-        if ( __ptr_in_range(&*__first, data(), data() + size()))
+        typedef typename iterator_traits<_ForwardIterator>::reference _CharRef;
+        _CharRef __tmp_ref = *__first;
+        if (__ptr_in_range(_VSTD::addressof(__tmp_ref), data(), data() + size()))
         {
             const basic_string __temp (__first, __last, __alloc());
             append(__temp.data(), __temp.size());
@@ -2406,7 +2408,9 @@ basic_string<_CharT, _Traits, _Allocator
     size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last));
     if (__n)
     {
-        if ( __ptr_in_range(&*__first, data(), data() + size()))
+        typedef typename iterator_traits<_ForwardIterator>::reference _CharRef;
+        _CharRef __tmp_char = *__first;
+        if (__ptr_in_range(_VSTD::addressof(__tmp_char), data(), data() + size()))
         {
             const basic_string __temp(__first, __last, __alloc());
             return insert(__pos, __temp.data(), __temp.data() + __temp.size());

Modified: libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp?rev=302070&r1=302069&r2=302070&view=diff
==============================================================================
--- libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp (original)
+++ libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp Wed May  3 14:48:55 2017
@@ -204,4 +204,20 @@ int main()
 	assert(s == "ABCD");
 	}
 
+  { // test with a move iterator that returns char&&
+    typedef forward_iterator<const char*> It;
+    typedef std::move_iterator<It> MoveIt;
+    const char p[] = "ABCD";
+    std::string s;
+    s.append(MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
+    assert(s == "ABCD");
+  }
+  { // test with a move iterator that returns char&&
+    typedef const char* It;
+    typedef std::move_iterator<It> MoveIt;
+    const char p[] = "ABCD";
+    std::string s;
+    s.append(MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
+    assert(s == "ABCD");
+  }
 }

Modified: libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp?rev=302070&r1=302069&r2=302070&view=diff
==============================================================================
--- libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp (original)
+++ libcxx/branches/release_40/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp Wed May  3 14:48:55 2017
@@ -188,10 +188,35 @@ int main()
 
 	{ // test assigning a different type
     typedef std::string S;
-	const uint8_t p[] = "ABCD";
+    const uint8_t p[] = "ABCD";
 
-	S s;
-	s.insert(s.begin(), p, p + 4);
-	assert(s == "ABCD");
+    S s;
+    s.insert(s.begin(), p, p + 4);
+    assert(s == "ABCD");
 	}
+
+  { // test with a move iterator that returns char&&
+    typedef input_iterator<const char*> It;
+    typedef std::move_iterator<It> MoveIt;
+    const char p[] = "ABCD";
+    std::string s;
+    s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
+    assert(s == "ABCD");
+  }
+  { // test with a move iterator that returns char&&
+    typedef forward_iterator<const char*> It;
+    typedef std::move_iterator<It> MoveIt;
+    const char p[] = "ABCD";
+    std::string s;
+    s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
+    assert(s == "ABCD");
+  }
+  { // test with a move iterator that returns char&&
+    typedef const char* It;
+    typedef std::move_iterator<It> MoveIt;
+    const char p[] = "ABCD";
+    std::string s;
+    s.insert(s.begin(), MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
+    assert(s == "ABCD");
+  }
 }




More information about the cfe-commits mailing list