[libcxx-commits] [libcxx] 036b80f - [libc++] [test] Improve test_exceptions() in each string.modifiers test.
Arthur O'Dwyer via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Apr 26 13:23:32 PDT 2021
Author: Arthur O'Dwyer
Date: 2021-04-26T16:22:43-04:00
New Revision: 036b80fcbbccee8199851158fd349230aa77d75e
URL: https://github.com/llvm/llvm-project/commit/036b80fcbbccee8199851158fd349230aa77d75e
DIFF: https://github.com/llvm/llvm-project/commit/036b80fcbbccee8199851158fd349230aa77d75e.diff
LOG: [libc++] [test] Improve test_exceptions() in each string.modifiers test.
When checking the strong exception guarantee, also check that
iterators haven't been invalidated.
Reviewed as part of https://reviews.llvm.org/D98573
Added:
Modified:
libcxx/test/std/strings/basic.string/string.modifiers/string_append/iterator.pass.cpp
libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp
libcxx/test/std/strings/basic.string/string.modifiers/string_insert/iter_iter_iter.pass.cpp
libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp
Removed:
################################################################################
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 8c0d3d78ab8fa..31ba8b05faf35 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
@@ -34,14 +34,21 @@ template <class S, class It>
void
test_exceptions(S s, It first, It last)
{
- S aCopy = s;
+ S original = s;
+ typename S::iterator begin = s.begin();
+ typename S::iterator end = s.end();
+
try {
s.append(first, last);
assert(false);
- }
- catch (...) {}
+ } catch (...) {}
+
+ // Part of "no effects" is that iterators and pointers
+ // into the string must not have been invalidated.
LIBCPP_ASSERT(s.__invariants());
- assert(s == aCopy);
+ assert(s == original);
+ assert(s.begin() == begin);
+ assert(s.end() == end);
}
#endif
diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp
index a4bad33c13d8b..60201c0862fc7 100644
--- a/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_assign/iterator.pass.cpp
@@ -34,14 +34,21 @@ template <class S, class It>
void
test_exceptions(S s, It first, It last)
{
- S aCopy = s;
+ S original = s;
+ typename S::iterator begin = s.begin();
+ typename S::iterator end = s.end();
+
try {
s.assign(first, last);
assert(false);
- }
- catch (...) {}
+ } catch (...) {}
+
+ // Part of "no effects" is that iterators and pointers
+ // into the string must not have been invalidated.
LIBCPP_ASSERT(s.__invariants());
- assert(s == aCopy);
+ assert(s == original);
+ assert(s.begin() == begin);
+ assert(s.end() == end);
}
#endif
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 471e3019ffced..d86da1cacc87f 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
@@ -37,14 +37,22 @@ void
test_exceptions(S s, typename S::
diff erence_type pos, It first, It last)
{
typename S::const_iterator p = s.cbegin() + pos;
- S aCopy = s;
+
+ S original = s;
+ typename S::iterator begin = s.begin();
+ typename S::iterator end = s.end();
+
try {
s.insert(p, first, last);
assert(false);
- }
- catch (...) {}
+ } catch (...) {}
+
+ // Part of "no effects" is that iterators and pointers
+ // into the string must not have been invalidated.
LIBCPP_ASSERT(s.__invariants());
- assert(s == aCopy);
+ assert(s == original);
+ assert(s.begin() == begin);
+ assert(s.end() == end);
}
#endif
diff --git a/libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp b/libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp
index 3e6907a17dd98..d5e58db3589d5 100644
--- a/libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.modifiers/string_replace/iter_iter_iter_iter.pass.cpp
@@ -44,14 +44,22 @@ test_exceptions(S s, typename S::size_type pos1, typename S::size_type n1, It f,
{
typename S::const_iterator first = s.begin() + pos1;
typename S::const_iterator last = s.begin() + pos1 + n1;
- S aCopy = s;
+
+ S original = s;
+ typename S::iterator begin = s.begin();
+ typename S::iterator end = s.end();
+
try {
s.replace(first, last, f, l);
assert(false);
- }
- catch (...) {}
+ } catch (...) {}
+
+ // Part of "no effects" is that iterators and pointers
+ // into the string must not have been invalidated.
LIBCPP_ASSERT(s.__invariants());
- assert(s == aCopy);
+ assert(s == original);
+ assert(s.begin() == begin);
+ assert(s.end() == end);
}
#endif
More information about the libcxx-commits
mailing list