mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-15 12:09:51 +00:00
Fix PR41017 - Build failure with _LIBCPP_DEBUG=0 and non-const-ref
comparator for std::sort() Our debug comparator assumed that the comparator it wraps would always accepts the values by const ref. This isn't required by the standard. This patch makes our __debug_less comparator forward the constness. llvm-svn: 355752
This commit is contained in:
parent
ce3be45cac
commit
6e4ec6022f
@ -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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user