[PATCH] D26623: [libcxx] [test] Swapping non-equal non-POCS allocators is UB.

2016-12-12 Thread Stephan T. Lavavej via Phabricator via cfe-commits
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.

2016-12-11 Thread Eric Fiselier via Phabricator via cfe-commits
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.

2016-12-05 Thread Stephan T. Lavavej via Phabricator via cfe-commits
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.

2016-11-15 Thread Marshall Clow via cfe-commits
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.

2016-11-14 Thread Stephan T. Lavavej via cfe-commits
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));