summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2017-04-15 06:49:02 +0000
committerEric Fiselier <eric@efcs.ca>2017-04-15 06:49:02 +0000
commite84fcb5f3d49761076b99c08ba9e13a519dfac4b (patch)
tree64e68e6a25d69845de589ff778c8eed3e2ada7c2
parent4d53a1cb31c4950b2a30af3f4f6148f7216ffd92 (diff)
downloadbcm5719-llvm-e84fcb5f3d49761076b99c08ba9e13a519dfac4b.tar.gz
bcm5719-llvm-e84fcb5f3d49761076b99c08ba9e13a519dfac4b.zip
Fix PR32642 - string::insert and string::append don't work with move_iterator.
llvm-svn: 300397
-rw-r--r--libcxx/include/string8
-rw-r--r--libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp16
-rw-r--r--libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp33
3 files changed, 51 insertions, 6 deletions
diff --git a/libcxx/include/string b/libcxx/include/string
index 6f9c19fe803..1bc91ed1249 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -2276,7 +2276,9 @@ basic_string<_CharT, _Traits, _Allocator>::__append_forward_unsafe(
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());
@@ -2440,7 +2442,9 @@ basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _Forward
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());
diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp
index dac8860f9a6..b464291d4c5 100644
--- a/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp
@@ -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");
+ }
}
diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp
index e5ce8e51e1d..2c8b6e4a188 100644
--- a/libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp
@@ -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");
+ }
}
OpenPOWER on IntegriCloud