From f42355e17c3f3d1d099d028a388796a64724ffdb Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Thu, 6 May 2021 12:18:09 -0400 Subject: [PATCH] [libc++] [test] Test that unordered_*::swap/move/assign does not invalidate iterators. And remove the dedicated debug-iterator tests; we want to test this in all modes. We have a CI step for testing the whole test suite with `--debug_level=1` now. Part of https://reviews.llvm.org/D102003 --- .../containers/unord/unord.map/db_move.pass.cpp | 35 --------------------- .../unord/unord.multimap/db_move.pass.cpp | 36 ---------------------- .../unord/unord.multiset/db_move.pass.cpp | 36 ---------------------- .../containers/unord/unord.set/db_move.pass.cpp | 35 --------------------- .../unord.map/unord.map.cnstr/assign_move.pass.cpp | 6 ++++ .../unord/unord.map/unord.map.cnstr/move.pass.cpp | 8 +++++ .../unord.map.swap/swap_non_member.pass.cpp | 8 +++++ .../unord.multimap.cnstr/assign_move.pass.cpp | 6 ++++ .../unord.multimap.cnstr/move.pass.cpp | 4 +++ .../unord.multimap.swap/swap_non_member.pass.cpp | 8 +++++ .../unord.multiset.cnstr/assign_move.pass.cpp | 8 +++++ .../unord.multiset.cnstr/move.pass.cpp | 4 +++ .../unord.multiset.swap/swap_non_member.pass.cpp | 8 +++++ .../unord.set/unord.set.cnstr/assign_move.pass.cpp | 6 ++++ .../unord/unord.set/unord.set.cnstr/move.pass.cpp | 4 +++ .../unord.set.swap/swap_non_member.pass.cpp | 8 +++++ 16 files changed, 78 insertions(+), 142 deletions(-) delete mode 100644 libcxx/test/libcxx/containers/unord/unord.map/db_move.pass.cpp delete mode 100644 libcxx/test/libcxx/containers/unord/unord.multimap/db_move.pass.cpp delete mode 100644 libcxx/test/libcxx/containers/unord/unord.multiset/db_move.pass.cpp delete mode 100644 libcxx/test/libcxx/containers/unord/unord.set/db_move.pass.cpp diff --git a/libcxx/test/libcxx/containers/unord/unord.map/db_move.pass.cpp b/libcxx/test/libcxx/containers/unord/unord.map/db_move.pass.cpp deleted file mode 100644 index 5f18cb3..0000000 --- a/libcxx/test/libcxx/containers/unord/unord.map/db_move.pass.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// - -// unordered_map(unordered_map&& u); - -// UNSUPPORTED: c++03 -// UNSUPPORTED: libcxx-no-debug-mode - -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DEBUG=1 -#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0)) - -#include -#include -#include - -#include "test_macros.h" - -int main(int, char**) { - std::unordered_map s1 = {{1, 1}, {2, 2}, {3, 3}}; - std::unordered_map::iterator i = s1.begin(); - std::pair k = *i; - std::unordered_map s2 = std::move(s1); - assert(*i == k); - s2.erase(i); - assert(s2.size() == 2); - - return 0; -} diff --git a/libcxx/test/libcxx/containers/unord/unord.multimap/db_move.pass.cpp b/libcxx/test/libcxx/containers/unord/unord.multimap/db_move.pass.cpp deleted file mode 100644 index 0aff618..0000000 --- a/libcxx/test/libcxx/containers/unord/unord.multimap/db_move.pass.cpp +++ /dev/null @@ -1,36 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++03 - -// - -// unordered_multimap(unordered_multimap&& u); - -// UNSUPPORTED: libcxx-no-debug-mode - -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DEBUG=1 -#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0)) - -#include -#include -#include - -#include "test_macros.h" - -int main(int, char**) { - std::unordered_multimap s1 = {{1, 1}, {2, 2}, {3, 3}}; - std::unordered_multimap::iterator i = s1.begin(); - std::pair k = *i; - std::unordered_multimap s2 = std::move(s1); - assert(*i == k); - s2.erase(i); - assert(s2.size() == 2); - - return 0; -} diff --git a/libcxx/test/libcxx/containers/unord/unord.multiset/db_move.pass.cpp b/libcxx/test/libcxx/containers/unord/unord.multiset/db_move.pass.cpp deleted file mode 100644 index 6e89ff2..0000000 --- a/libcxx/test/libcxx/containers/unord/unord.multiset/db_move.pass.cpp +++ /dev/null @@ -1,36 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++03 - -// - -// unordered_multiset(unordered_multiset&& u); - -// UNSUPPORTED: libcxx-no-debug-mode - -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DEBUG=1 -#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0)) - -#include -#include -#include - -#include "test_macros.h" - -int main(int, char**) { - std::unordered_multiset s1 = {1, 2, 3}; - std::unordered_multiset::iterator i = s1.begin(); - int k = *i; - std::unordered_multiset s2 = std::move(s1); - assert(*i == k); - s2.erase(i); - assert(s2.size() == 2); - - return 0; -} diff --git a/libcxx/test/libcxx/containers/unord/unord.set/db_move.pass.cpp b/libcxx/test/libcxx/containers/unord/unord.set/db_move.pass.cpp deleted file mode 100644 index ba7c095..0000000 --- a/libcxx/test/libcxx/containers/unord/unord.set/db_move.pass.cpp +++ /dev/null @@ -1,35 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++03 -// UNSUPPORTED: libcxx-no-debug-mode - -// - -// unordered_set(unordered_set&& u); - -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DEBUG=1 -#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0)) - -#include -#include -#include - -#include "test_macros.h" - -int main(int, char**) { - std::unordered_set s1 = {1, 2, 3}; - std::unordered_set::iterator i = s1.begin(); - int k = *i; - std::unordered_set s2 = std::move(s1); - assert(*i == k); - s2.erase(i); - assert(s2.size() == 2); - - return 0; -} diff --git a/libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/assign_move.pass.cpp b/libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/assign_move.pass.cpp index ceb7a02..2378a5d 100644 --- a/libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/assign_move.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/assign_move.pass.cpp @@ -105,6 +105,7 @@ int main(int, char**) test_compare >(3), A(10) ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); @@ -121,6 +122,7 @@ int main(int, char**) assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); assert(c0.size() == 0); + assert(it0 == c.begin()); // Iterators remain valid } { typedef other_allocator > A; @@ -151,6 +153,7 @@ int main(int, char**) test_compare >(3), A(4) ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); @@ -167,6 +170,7 @@ int main(int, char**) assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); assert(c0.size() == 0); + assert(it0 == c.begin()); // Iterators remain valid } { typedef min_allocator > A; @@ -197,6 +201,7 @@ int main(int, char**) test_compare >(3), A() ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); @@ -213,6 +218,7 @@ int main(int, char**) assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); assert(c0.size() == 0); + assert(it0 == c.begin()); // Iterators remain valid } return 0; diff --git a/libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/move.pass.cpp b/libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/move.pass.cpp index 6efaa63..363f2f8 100644 --- a/libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/move.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.map/unord.map.cnstr/move.pass.cpp @@ -42,6 +42,7 @@ int main(int, char**) test_compare >(9), test_allocator >(10) ); + C::iterator it0 = c0.begin(); C c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 0); @@ -54,6 +55,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid assert(c0.empty()); } @@ -79,6 +81,7 @@ int main(int, char**) test_compare >(9), test_allocator >(10) ); + C::iterator it0 = c0.begin(); C c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); @@ -95,6 +98,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid assert(c0.empty()); } @@ -109,6 +113,7 @@ int main(int, char**) test_compare >(9), min_allocator >() ); + C::iterator it0 = c0.begin(); C c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 0); @@ -121,6 +126,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(c.load_factor() == 0); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid assert(c0.empty()); } @@ -146,6 +152,7 @@ int main(int, char**) test_compare >(9), min_allocator >() ); + C::iterator it0 = c0.begin(); C c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); @@ -162,6 +169,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(std::fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid assert(c0.empty()); } diff --git a/libcxx/test/std/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp b/libcxx/test/std/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp index 7852394..d145c74 100644 --- a/libcxx/test/std/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp @@ -75,6 +75,7 @@ int main(int, char**) C c1(0, Hash(1), Compare(1), Alloc(1, 1)); C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it2 = c2.begin(); swap(c1, c2); assert(c1.bucket_count() >= 8); @@ -93,6 +94,7 @@ int main(int, char**) assert(static_cast(std::distance(c1.begin(), c1.end())) == c1.size()); assert(static_cast(std::distance(c1.cbegin(), c1.cend())) == c1.size()); assert(c1.max_load_factor() == 2); + assert(it2 == c1.begin()); // Iterators are not invalidated LIBCPP_ASSERT(c2.bucket_count() == 0); assert(c2.size() == 0); @@ -121,6 +123,7 @@ int main(int, char**) C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1)); C c2(0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it1 = c1.begin(); swap(c1, c2); LIBCPP_ASSERT(c1.bucket_count() == 0); @@ -144,6 +147,7 @@ int main(int, char**) assert(static_cast(std::distance(c2.begin(), c2.end())) == c2.size()); assert(static_cast(std::distance(c2.cbegin(), c2.cend())) == c2.size()); assert(c2.max_load_factor() == 1); + assert(it1 == c2.begin()); // Iterators are not invalidated } { typedef test_hash > Hash; @@ -174,6 +178,8 @@ int main(int, char**) C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1)); C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it1 = c1.begin(); + C::iterator it2 = c2.begin(); swap(c1, c2); assert(c1.bucket_count() >= 8); @@ -192,6 +198,7 @@ int main(int, char**) assert(static_cast(std::distance(c1.begin(), c1.end())) == c1.size()); assert(static_cast(std::distance(c1.cbegin(), c1.cend())) == c1.size()); assert(c1.max_load_factor() == 2); + assert(it2 == c1.begin()); // Iterators are not invalidated assert(c2.bucket_count() >= 4); assert(c2.size() == 4); @@ -205,6 +212,7 @@ int main(int, char**) assert(static_cast(std::distance(c2.begin(), c2.end())) == c2.size()); assert(static_cast(std::distance(c2.cbegin(), c2.cend())) == c2.size()); assert(c2.max_load_factor() == 1); + assert(it1 == c2.begin()); // Iterators are not invalidated } { diff --git a/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/assign_move.pass.cpp b/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/assign_move.pass.cpp index dfc64bd..e163d0a 100644 --- a/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/assign_move.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/assign_move.pass.cpp @@ -122,7 +122,9 @@ int main(int, char**) test_compare >(3), A(10) ); + C::iterator it0 = c0.begin(); c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); typedef std::pair Eq; @@ -182,7 +184,9 @@ int main(int, char**) test_compare >(3), A(4) ); + C::iterator it0 = c0.begin(); c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); typedef std::pair Eq; @@ -242,7 +246,9 @@ int main(int, char**) test_compare >(3), A() ); + C::iterator it0 = c0.begin(); c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); typedef std::pair Eq; diff --git a/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move.pass.cpp b/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move.pass.cpp index a0a707c..d61d58a 100644 --- a/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.cnstr/move.pass.cpp @@ -82,7 +82,9 @@ int main(int, char**) test_compare >(9), test_allocator >(10) ); + C::iterator it0 = c0.begin(); C c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); typedef std::pair Eq; @@ -166,7 +168,9 @@ int main(int, char**) test_compare >(9), min_allocator >() ); + C::iterator it0 = c0.begin(); C c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); typedef std::pair Eq; diff --git a/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp b/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp index 9fcd6cc..1d0532f 100644 --- a/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp @@ -77,6 +77,7 @@ int main(int, char**) C c1(0, Hash(1), Compare(1), Alloc(1, 1)); C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it2 = c2.begin(); swap(c1, c2); assert(c1.bucket_count() >= 8); @@ -95,6 +96,7 @@ int main(int, char**) assert(static_cast(std::distance(c1.begin(), c1.end())) == c1.size()); assert(static_cast(std::distance(c1.cbegin(), c1.cend())) == c1.size()); assert(c1.max_load_factor() == 2); + assert(it2 == c1.begin()); // Iterators are not invalidated LIBCPP_ASSERT(c2.bucket_count() == 0); assert(c2.size() == 0); @@ -123,6 +125,7 @@ int main(int, char**) C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1)); C c2(0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it1 = c1.begin(); swap(c1, c2); LIBCPP_ASSERT(c1.bucket_count() == 0); @@ -151,6 +154,7 @@ int main(int, char**) assert(static_cast(std::distance(c2.begin(), c2.end())) == c2.size()); assert(static_cast(std::distance(c2.cbegin(), c2.cend())) == c2.size()); assert(c2.max_load_factor() == 1); + assert(it1 == c2.begin()); // Iterators are not invalidated } { typedef test_hash > Hash; @@ -181,6 +185,8 @@ int main(int, char**) C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1)); C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it1 = c1.begin(); + C::iterator it2 = c2.begin(); swap(c1, c2); assert(c1.bucket_count() >= 8); @@ -199,6 +205,7 @@ int main(int, char**) assert(static_cast(std::distance(c1.begin(), c1.end())) == c1.size()); assert(static_cast(std::distance(c1.cbegin(), c1.cend())) == c1.size()); assert(c1.max_load_factor() == 2); + assert(it2 == c1.begin()); // Iterators are not invalidated assert(c2.bucket_count() >= 6); assert(c2.size() == 6); @@ -217,6 +224,7 @@ int main(int, char**) assert(static_cast(std::distance(c2.begin(), c2.end())) == c2.size()); assert(static_cast(std::distance(c2.cbegin(), c2.cend())) == c2.size()); assert(c2.max_load_factor() == 1); + assert(it1 == c2.begin()); // Iterators are not invalidated } { diff --git a/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/assign_move.pass.cpp b/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/assign_move.pass.cpp index 9a9069e..26c9c59 100644 --- a/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/assign_move.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/assign_move.pass.cpp @@ -105,6 +105,7 @@ int main(int, char**) test_compare >(3), A(10) ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); @@ -120,6 +121,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid } { typedef other_allocator A; @@ -150,6 +152,7 @@ int main(int, char**) test_compare >(3), A(4) ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); @@ -165,6 +168,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid } { typedef test_allocator A; @@ -195,6 +199,7 @@ int main(int, char**) test_compare >(3), A() ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); @@ -210,6 +215,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid } { typedef min_allocator A; @@ -240,6 +246,7 @@ int main(int, char**) test_compare >(3), A() ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); @@ -255,6 +262,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid } return 0; diff --git a/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/move.pass.cpp b/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/move.pass.cpp index fbb4f5f..fa02494 100644 --- a/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/move.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.cnstr/move.pass.cpp @@ -77,7 +77,9 @@ int main(int, char**) test_compare >(9), test_allocator(10) ); + C::iterator it0 = c0.begin(); C c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); assert(c.count(1) == 2); @@ -142,7 +144,9 @@ int main(int, char**) test_compare >(9), min_allocator() ); + C::iterator it0 = c0.begin(); C c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 6); assert(c.count(1) == 2); diff --git a/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp b/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp index 706c995..5b5a4cd 100644 --- a/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp @@ -74,6 +74,7 @@ int main(int, char**) C c1(0, Hash(1), Compare(1), Alloc(1, 1)); C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it2 = c2.begin(); swap(c1, c2); assert(c1.bucket_count() >= 8); @@ -92,6 +93,7 @@ int main(int, char**) assert(static_cast(std::distance(c1.begin(), c1.end())) == c1.size()); assert(static_cast(std::distance(c1.cbegin(), c1.cend())) == c1.size()); assert(c1.max_load_factor() == 2); + assert(it2 == c1.begin()); // Iterators are not invalidated LIBCPP_ASSERT(c2.bucket_count() == 0); assert(c2.size() == 0); @@ -120,6 +122,7 @@ int main(int, char**) C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1)); C c2(0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it1 = c1.begin(); swap(c1, c2); LIBCPP_ASSERT(c1.bucket_count() == 0); @@ -143,6 +146,7 @@ int main(int, char**) assert(static_cast(std::distance(c2.begin(), c2.end())) == c2.size()); assert(static_cast(std::distance(c2.cbegin(), c2.cend())) == c2.size()); assert(c2.max_load_factor() == 1); + assert(it1 == c2.begin()); // Iterators are not invalidated } { typedef test_hash > Hash; @@ -173,6 +177,8 @@ int main(int, char**) C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1)); C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it1 = c1.begin(); + C::iterator it2 = c2.begin(); swap(c1, c2); assert(c1.bucket_count() >= 8); @@ -191,6 +197,7 @@ int main(int, char**) assert(static_cast(std::distance(c1.begin(), c1.end())) == c1.size()); assert(static_cast(std::distance(c1.cbegin(), c1.cend())) == c1.size()); assert(c1.max_load_factor() == 2); + assert(it2 == c1.begin()); // Iterators are not invalidated assert(c2.bucket_count() >= 6); assert(c2.size() == 6); @@ -204,6 +211,7 @@ int main(int, char**) assert(static_cast(std::distance(c2.begin(), c2.end())) == c2.size()); assert(static_cast(std::distance(c2.cbegin(), c2.cend())) == c2.size()); assert(c2.max_load_factor() == 1); + assert(it1 == c2.begin()); // Iterators are not invalidated } { diff --git a/libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/assign_move.pass.cpp b/libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/assign_move.pass.cpp index 276d724..1edbe0b 100644 --- a/libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/assign_move.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/assign_move.pass.cpp @@ -104,6 +104,7 @@ int main(int, char**) test_compare >(3), A(10) ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); @@ -119,6 +120,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid } { typedef other_allocator A; @@ -149,6 +151,7 @@ int main(int, char**) test_compare >(3), A(4) ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); @@ -164,6 +167,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid } { typedef min_allocator A; @@ -194,6 +198,7 @@ int main(int, char**) test_compare >(3), A() ); + C::iterator it0 = c0.begin(); c = std::move(c0); LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); @@ -209,6 +214,7 @@ int main(int, char**) assert(static_cast(std::distance(c.cbegin(), c.cend())) == c.size()); assert(fabs(c.load_factor() - (float)c.size()/c.bucket_count()) < FLT_EPSILON); assert(c.max_load_factor() == 1); + assert(it0 == c.begin()); // Iterators remain valid } return 0; diff --git a/libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/move.pass.cpp b/libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/move.pass.cpp index 2fc64ed..dd3822e 100644 --- a/libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/move.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.set/unord.set.cnstr/move.pass.cpp @@ -77,7 +77,9 @@ int main(int, char**) test_compare >(9), test_allocator(10) ); + C::iterator it0 = c0.begin(); C c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); assert(c.count(1) == 1); @@ -142,7 +144,9 @@ int main(int, char**) test_compare >(9), min_allocator() ); + C::iterator it0 = c0.begin(); C c = std::move(c0); + assert(it0 == c.begin()); // Iterators remain valid LIBCPP_ASSERT(c.bucket_count() == 7); assert(c.size() == 4); assert(c.count(1) == 1); diff --git a/libcxx/test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp b/libcxx/test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp index 8f1d9f0..c128bd5 100644 --- a/libcxx/test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp @@ -74,6 +74,7 @@ int main(int, char**) C c1(0, Hash(1), Compare(1), Alloc(1, 1)); C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it2 = c2.begin(); swap(c1, c2); assert(c1.bucket_count() >= 8); @@ -92,6 +93,7 @@ int main(int, char**) assert(static_cast(std::distance(c1.begin(), c1.end())) == c1.size()); assert(static_cast(std::distance(c1.cbegin(), c1.cend())) == c1.size()); assert(c1.max_load_factor() == 2); + assert(it2 == c1.begin()); // Iterators are not invalidated LIBCPP_ASSERT(c2.bucket_count() == 0); assert(c2.size() == 0); @@ -120,6 +122,7 @@ int main(int, char**) C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1)); C c2(0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it1 = c1.begin(); swap(c1, c2); LIBCPP_ASSERT(c1.bucket_count() == 0); @@ -143,6 +146,7 @@ int main(int, char**) assert(static_cast(std::distance(c2.begin(), c2.end())) == c2.size()); assert(static_cast(std::distance(c2.cbegin(), c2.cend())) == c2.size()); assert(c2.max_load_factor() == 1); + assert(it1 == c2.begin()); // Iterators are not invalidated } { typedef test_hash > Hash; @@ -173,6 +177,8 @@ int main(int, char**) C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1, 1)); C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(1, 2)); c2.max_load_factor(2); + C::iterator it1 = c1.begin(); + C::iterator it2 = c2.begin(); swap(c1, c2); assert(c1.bucket_count() >= 8); @@ -191,6 +197,7 @@ int main(int, char**) assert(static_cast(std::distance(c1.begin(), c1.end())) == c1.size()); assert(static_cast(std::distance(c1.cbegin(), c1.cend())) == c1.size()); assert(c1.max_load_factor() == 2); + assert(it2 == c1.begin()); // Iterators are not invalidated assert(c2.bucket_count() >= 4); assert(c2.size() == 4); @@ -204,6 +211,7 @@ int main(int, char**) assert(static_cast(std::distance(c2.begin(), c2.end())) == c2.size()); assert(static_cast(std::distance(c2.cbegin(), c2.cend())) == c2.size()); assert(c2.max_load_factor() == 1); + assert(it1 == c2.begin()); // Iterators are not invalidated } { -- 2.7.4