diff options
-rw-r--r-- | libcxx/include/algorithm | 10 | ||||
-rw-r--r-- | libcxx/test/libcxx/algorithms/debug_less.pass.cpp | 29 |
2 files changed, 32 insertions, 7 deletions
diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm index 7da753a490d..cb619c264fd 100644 --- a/libcxx/include/algorithm +++ b/libcxx/include/algorithm @@ -784,7 +784,7 @@ struct __debug_less __debug_less(_Compare& __c) : __comp_(__c) {} template <class _Tp, class _Up> - bool operator()(const _Tp& __x, const _Up& __y) + bool operator()(_Tp& __x, _Up& __y) { bool __r = __comp_(__x, __y); if (__r) @@ -795,18 +795,18 @@ struct __debug_less template <class _LHS, class _RHS> inline _LIBCPP_INLINE_VISIBILITY decltype((void)_VSTD::declval<_Compare&>()( - _VSTD::declval<_LHS const&>(), _VSTD::declval<_RHS const&>())) - __do_compare_assert(int, _LHS const& __l, _RHS const& __r) { + _VSTD::declval<_LHS &>(), _VSTD::declval<_RHS &>())) + __do_compare_assert(int, _LHS & __l, _RHS & __r) { _LIBCPP_ASSERT(!__comp_(__l, __r), "Comparator does not induce a strict weak ordering"); } template <class _LHS, class _RHS> inline _LIBCPP_INLINE_VISIBILITY - void __do_compare_assert(long, _LHS const&, _RHS const&) {} + void __do_compare_assert(long, _LHS &, _RHS &) {} }; -#endif // _LIBCPP_DEBUG +#endif // _LIBCPP_DEBUG // all_of diff --git a/libcxx/test/libcxx/algorithms/debug_less.pass.cpp b/libcxx/test/libcxx/algorithms/debug_less.pass.cpp index 247e07f06e0..4f9285421fc 100644 --- a/libcxx/test/libcxx/algorithms/debug_less.pass.cpp +++ b/libcxx/test/libcxx/algorithms/debug_less.pass.cpp @@ -20,8 +20,11 @@ struct DebugException {}; #define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : throw ::DebugException()) #include <algorithm> +#include <iterator> #include <cassert> +#include "test_macros.h" + template <int ID> struct MyType { int value; @@ -210,10 +213,32 @@ void test_upper_and_lower_bound() { } } +struct NonConstArgCmp { + bool operator()(int& x, int &y) const { + return x < y; + } +}; + +void test_non_const_arg_cmp() { + { + NonConstArgCmp cmp; + __debug_less<NonConstArgCmp> dcmp(cmp); + int x = 0, y = 1; + assert(dcmp(x, y)); + assert(!dcmp(y, x)); + } + { + NonConstArgCmp cmp; + int arr[] = {5, 4, 3, 2, 1}; + std::sort(std::begin(arr), std::end(arr), cmp); + assert(std::is_sorted(std::begin(arr), std::end(arr))); + } +} + int main(int, char**) { test_passing(); test_failing(); test_upper_and_lower_bound(); - - return 0; + test_non_const_arg_cmp(); + return 0; } |