[libcxx-commits] [libcxx] r352087 - D14686: 'Protect against overloaded comma in random_shuffle and improve tests' I had to cut back on the tests with this, because they were not C++03 friendly. Thanks to gribozavr for the patch

Marshall Clow via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jan 24 11:20:19 PST 2019


Author: marshall
Date: Thu Jan 24 11:20:19 2019
New Revision: 352087

URL: http://llvm.org/viewvc/llvm-project?rev=352087&view=rev
Log:
D14686: 'Protect against overloaded comma in random_shuffle and improve tests' I had to cut back on the tests with this, because they were not C++03 friendly. Thanks to gribozavr for the patch

Modified:
    libcxx/trunk/include/algorithm
    libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp
    libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp

Modified: libcxx/trunk/include/algorithm
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/algorithm?rev=352087&r1=352086&r2=352087&view=diff
==============================================================================
--- libcxx/trunk/include/algorithm (original)
+++ libcxx/trunk/include/algorithm Thu Jan 24 11:20:19 2019
@@ -2989,7 +2989,7 @@ random_shuffle(_RandomAccessIterator __f
     {
         _Dp __uid;
         __rs_default __g = __rs_get();
-        for (--__last, --__d; __first < __last; ++__first, --__d)
+        for (--__last, (void) --__d; __first < __last; ++__first, (void) --__d)
         {
             difference_type __i = __uid(__g, _Pp(0, __d));
             if (__i != difference_type(0))
@@ -3011,7 +3011,7 @@ random_shuffle(_RandomAccessIterator __f
     difference_type __d = __last - __first;
     if (__d > 1)
     {
-        for (--__last; __first < __last; ++__first, --__d)
+        for (--__last; __first < __last; ++__first, (void) --__d)
         {
             difference_type __i = __rand(__d);
             if (__i != difference_type(0))

Modified: libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp?rev=352087&r1=352086&r2=352087&view=diff
==============================================================================
--- libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp (original)
+++ libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp Thu Jan 24 11:20:19 2019
@@ -18,17 +18,43 @@
 #include <cassert>
 
 #include "test_macros.h"
+#include "test_iterators.h"
+
+template <class Iter>
+void
+test_with_iterator()
+{
+    int empty[] = {};
+    std::random_shuffle(Iter(empty), Iter(empty));
+
+    const int all_elements[] = {1, 2, 3, 4};
+    int           shuffled[] = {1, 2, 3, 4};
+    const unsigned size = sizeof(all_elements)/sizeof(all_elements[0]);
+
+    std::random_shuffle(Iter(shuffled), Iter(shuffled+size));
+    assert(std::is_permutation(shuffled, shuffled+size, all_elements));
+
+    std::random_shuffle(Iter(shuffled), Iter(shuffled+size));
+    assert(std::is_permutation(shuffled, shuffled+size, all_elements));
+}
+
 
 int main()
 {
-    int ia[] = {1, 2, 3, 4};
+    int ia[]  = {1, 2, 3, 4};
     int ia1[] = {1, 4, 3, 2};
     int ia2[] = {4, 1, 2, 3};
     const unsigned sa = sizeof(ia)/sizeof(ia[0]);
+
     std::random_shuffle(ia, ia+sa);
     LIBCPP_ASSERT(std::equal(ia, ia+sa, ia1));
     assert(std::is_permutation(ia, ia+sa, ia1));
+
     std::random_shuffle(ia, ia+sa);
     LIBCPP_ASSERT(std::equal(ia, ia+sa, ia2));
     assert(std::is_permutation(ia, ia+sa, ia2));
+
+    test_with_iterator<random_access_iterator<int*> >();
+    test_with_iterator<int*>();
+
 }

Modified: libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp?rev=352087&r1=352086&r2=352087&view=diff
==============================================================================
--- libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp (original)
+++ libcxx/trunk/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp Thu Jan 24 11:20:19 2019
@@ -20,6 +20,8 @@
 #include <cstddef>
 
 #include "test_macros.h"
+#include "test_iterators.h"
+
 
 struct gen
 {
@@ -29,13 +31,28 @@ struct gen
     }
 };
 
-int main()
+
+template <class Iter>
+void
+test_with_iterator()
 {
+
     int ia[] = {1, 2, 3, 4};
     int ia1[] = {4, 1, 2, 3};
     const unsigned sa = sizeof(ia)/sizeof(ia[0]);
     gen r;
+
     std::random_shuffle(ia, ia+sa, r);
     LIBCPP_ASSERT(std::equal(ia, ia+sa, ia1));
     assert(std::is_permutation(ia, ia+sa, ia1));
+
+    std::random_shuffle(ia, ia+sa, r);
+    assert(std::is_permutation(ia, ia+sa, ia1));
 }
+
+
+int main()
+{
+    test_with_iterator<random_access_iterator<int*> >();
+    test_with_iterator<int*>();
+}
\ No newline at end of file




More information about the libcxx-commits mailing list