diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2019-01-24 19:20:19 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2019-01-24 19:20:19 +0000 |
commit | 5a8525e0b6d2fb18e54db6f484597c81c7a067d7 (patch) | |
tree | 0d0e5c1389d170bf64bb2b4cdc886eb91af1ec9d | |
parent | 03f9e25bb0a91cf1b3bea0c62a93aab7518ccde7 (diff) | |
download | bcm5719-llvm-5a8525e0b6d2fb18e54db6f484597c81c7a067d7.tar.gz bcm5719-llvm-5a8525e0b6d2fb18e54db6f484597c81c7a067d7.zip |
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
llvm-svn: 352087
3 files changed, 47 insertions, 4 deletions
diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm index 310256e614f..b52d445225b 100644 --- a/libcxx/include/algorithm +++ b/libcxx/include/algorithm @@ -2989,7 +2989,7 @@ random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) { _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 __first, _RandomAccessIterator __last, 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)) diff --git a/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp b/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp index 6a85b995cb1..6ae7eb964a1 100644 --- a/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp +++ b/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle.pass.cpp @@ -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*>(); + } diff --git a/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp b/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp index 6cab25cc790..ffdb098fc53 100644 --- a/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp +++ b/libcxx/test/std/algorithms/alg.modifying.operations/alg.random.shuffle/random_shuffle_rand.pass.cpp @@ -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 |