[PATCH] D26623: [libcxx] [test] Swapping non-equal non-POCS allocators is UB.
STL_MSFT abandoned this revision. STL_MSFT added a comment. r289358 fixes everything for me, thanks! Abandoning this revision. https://reviews.llvm.org/D26623 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26623: [libcxx] [test] Swapping non-equal non-POCS allocators is UB.
EricWF added a comment. I hope you don't mind but I committed by own version of this change as r289358. I was concerned about testing that the container didn't actually perform a swap, so I modified test_allocator to take an "id" parameter that does not participate in equality. I then changed the tests to check that the "id" was unchanged after the swap. Once confirming that r289358 fixes your issues could you please close this review? https://reviews.llvm.org/D26623 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26623: [libcxx] [test] Swapping non-equal non-POCS allocators is UB.
STL_MSFT updated this revision to Diff 80352. STL_MSFT added a comment. Merged with the recent addition of static_cast to various lines in the unordered container tests. No actual changes to the diff, only to the context. https://reviews.llvm.org/D26623 Files: test/std/containers/associative/map/map.special/non_member_swap.pass.cpp test/std/containers/associative/multimap/multimap.special/non_member_swap.pass.cpp test/std/containers/associative/multiset/multiset.special/non_member_swap.pass.cpp test/std/containers/associative/set/set.special/non_member_swap.pass.cpp test/std/containers/sequences/deque/deque.special/swap.pass.cpp test/std/containers/sequences/forwardlist/forwardlist.spec/member_swap.pass.cpp test/std/containers/sequences/forwardlist/forwardlist.spec/non_member_swap.pass.cpp test/std/containers/sequences/vector.bool/swap.pass.cpp test/std/containers/sequences/vector/vector.special/swap.pass.cpp test/std/containers/unord/unord.map/swap_member.pass.cpp test/std/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp test/std/containers/unord/unord.multimap/swap_member.pass.cpp test/std/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp test/std/containers/unord/unord.multiset/swap_member.pass.cpp test/std/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp test/std/containers/unord/unord.set/swap_member.pass.cpp test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp Index: test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp === --- test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp +++ test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp @@ -33,25 +33,25 @@ typedef test_allocator Alloc; typedef std::unordered_set C; typedef int P; -C c1(0, Hash(1), Compare(1), Alloc(1)); -C c2(0, Hash(2), Compare(2), Alloc(2)); +C c1(0, Hash(1), Compare(1), Alloc(3)); +C c2(0, Hash(2), Compare(2), Alloc(3)); c2.max_load_factor(2); swap(c1, c2); LIBCPP_ASSERT(c1.bucket_count() == 0); assert(c1.size() == 0); assert(c1.hash_function() == Hash(2)); assert(c1.key_eq() == Compare(2)); -assert(c1.get_allocator() == Alloc(1)); +assert(c1.get_allocator() == Alloc(3)); 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); LIBCPP_ASSERT(c2.bucket_count() == 0); assert(c2.size() == 0); assert(c2.hash_function() == Hash(1)); assert(c2.key_eq() == Compare(1)); -assert(c2.get_allocator() == Alloc(2)); +assert(c2.get_allocator() == Alloc(3)); 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); @@ -73,8 +73,8 @@ P(70), P(80) }; -C c1(0, Hash(1), Compare(1), Alloc(1)); -C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(2)); +C c1(0, Hash(1), Compare(1), Alloc(3)); +C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(3)); c2.max_load_factor(2); swap(c1, c2); @@ -90,16 +90,16 @@ assert(*c1.find(80) == 80); assert(c1.hash_function() == Hash(2)); assert(c1.key_eq() == Compare(2)); -assert(c1.get_allocator() == Alloc(1)); +assert(c1.get_allocator() == Alloc(3)); 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); LIBCPP_ASSERT(c2.bucket_count() == 0); assert(c2.size() == 0); assert(c2.hash_function() == Hash(1)); assert(c2.key_eq() == Compare(1)); -assert(c2.get_allocator() == Alloc(2)); +assert(c2.get_allocator() == Alloc(3)); 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); @@ -119,16 +119,16 @@ P(1), P(2) }; -C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1)); -C c2(0, Hash(2), Compare(2), Alloc(2)); +C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(3)); +C c2(0, Hash(2), Compare(2), Alloc(3)); c2.max_load_factor(2); swap(c1, c2); LIBCPP_ASSERT(c1.bucket_count() == 0); assert(c1.size() == 0); assert(c1.hash_function() == Hash(2))
[PATCH] D26623: [libcxx] [test] Swapping non-equal non-POCS allocators is UB.
mclow.lists added a comment. I'm working on this, too. Trying to decide what the right choice is here. https://reviews.llvm.org/D26623 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D26623: [libcxx] [test] Swapping non-equal non-POCS allocators is UB.
STL_MSFT created this revision. STL_MSFT added reviewers: EricWF, mclow.lists. STL_MSFT added a subscriber: cfe-commits. [libcxx] [test] Swapping non-equal non-POCS allocators is UB. test_allocator is a non-POCS allocator. Instead of swapping containers with A(1) and A(2), which triggers undefined behavior, swapping A(3) with A(3) is conformant. test/std/containers/sequences/vector/vector.special/swap.pass.cpp Remove "#ifndef _LIBCPP_DEBUG_LEVEL" and a comment about the now-fixed undefined behavior. https://reviews.llvm.org/D26623 Files: test/std/containers/associative/map/map.special/non_member_swap.pass.cpp test/std/containers/associative/multimap/multimap.special/non_member_swap.pass.cpp test/std/containers/associative/multiset/multiset.special/non_member_swap.pass.cpp test/std/containers/associative/set/set.special/non_member_swap.pass.cpp test/std/containers/sequences/deque/deque.special/swap.pass.cpp test/std/containers/sequences/forwardlist/forwardlist.spec/member_swap.pass.cpp test/std/containers/sequences/forwardlist/forwardlist.spec/non_member_swap.pass.cpp test/std/containers/sequences/vector.bool/swap.pass.cpp test/std/containers/sequences/vector/vector.special/swap.pass.cpp test/std/containers/unord/unord.map/swap_member.pass.cpp test/std/containers/unord/unord.map/unord.map.swap/swap_non_member.pass.cpp test/std/containers/unord/unord.multimap/swap_member.pass.cpp test/std/containers/unord/unord.multimap/unord.multimap.swap/swap_non_member.pass.cpp test/std/containers/unord/unord.multiset/swap_member.pass.cpp test/std/containers/unord/unord.multiset/unord.multiset.swap/swap_non_member.pass.cpp test/std/containers/unord/unord.set/swap_member.pass.cpp test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp Index: test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp === --- test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp +++ test/std/containers/unord/unord.set/unord.set.swap/swap_non_member.pass.cpp @@ -32,25 +32,25 @@ typedef test_allocator Alloc; typedef std::unordered_set C; typedef int P; -C c1(0, Hash(1), Compare(1), Alloc(1)); -C c2(0, Hash(2), Compare(2), Alloc(2)); +C c1(0, Hash(1), Compare(1), Alloc(3)); +C c2(0, Hash(2), Compare(2), Alloc(3)); c2.max_load_factor(2); swap(c1, c2); LIBCPP_ASSERT(c1.bucket_count() == 0); assert(c1.size() == 0); assert(c1.hash_function() == Hash(2)); assert(c1.key_eq() == Compare(2)); -assert(c1.get_allocator() == Alloc(1)); +assert(c1.get_allocator() == Alloc(3)); assert(std::distance(c1.begin(), c1.end()) == c1.size()); assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); assert(c1.max_load_factor() == 2); LIBCPP_ASSERT(c2.bucket_count() == 0); assert(c2.size() == 0); assert(c2.hash_function() == Hash(1)); assert(c2.key_eq() == Compare(1)); -assert(c2.get_allocator() == Alloc(2)); +assert(c2.get_allocator() == Alloc(3)); assert(std::distance(c2.begin(), c2.end()) == c2.size()); assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); @@ -72,8 +72,8 @@ P(70), P(80) }; -C c1(0, Hash(1), Compare(1), Alloc(1)); -C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(2)); +C c1(0, Hash(1), Compare(1), Alloc(3)); +C c2(std::begin(a2), std::end(a2), 0, Hash(2), Compare(2), Alloc(3)); c2.max_load_factor(2); swap(c1, c2); @@ -89,16 +89,16 @@ assert(*c1.find(80) == 80); assert(c1.hash_function() == Hash(2)); assert(c1.key_eq() == Compare(2)); -assert(c1.get_allocator() == Alloc(1)); +assert(c1.get_allocator() == Alloc(3)); assert(std::distance(c1.begin(), c1.end()) == c1.size()); assert(std::distance(c1.cbegin(), c1.cend()) == c1.size()); assert(c1.max_load_factor() == 2); LIBCPP_ASSERT(c2.bucket_count() == 0); assert(c2.size() == 0); assert(c2.hash_function() == Hash(1)); assert(c2.key_eq() == Compare(1)); -assert(c2.get_allocator() == Alloc(2)); +assert(c2.get_allocator() == Alloc(3)); assert(std::distance(c2.begin(), c2.end()) == c2.size()); assert(std::distance(c2.cbegin(), c2.cend()) == c2.size()); assert(c2.max_load_factor() == 1); @@ -118,16 +118,16 @@ P(1), P(2) }; -C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(1)); -C c2(0, Hash(2), Compare(2), Alloc(2)); +C c1(std::begin(a1), std::end(a1), 0, Hash(1), Compare(1), Alloc(3)); +C c2(0, Hash(2), Compare(2), Alloc(3));